; ****************************************************************************************** ; PATHBAR ; ^^^^^^^ ; V 1.10 ; Copyright (C) 2009 Andesdaf www.purebasic.fr/german/ ; ; ****************************************************************************************** ; INTERFACE-FUNKTIONEN ; ^^^^^^^^^^^^^^^^^^^^ ; PathBarInit() ; PathBarColor() ; PathBarTextHeight() ; PathBarSpecialFont() ; PathBarSpecialChar() ; PathBarTextFont() ; PathbarFree() ; AddPathBar() ; RemovePathBar() ; AddPathBarRoot() ; ResizePathBar() ; PathBarGetPath() ; PathBarStyle() ; PathBarSetPath() ; ProcessPathBarEvent() ; ; ****************************************************************************************** ; VERWENDETE CODESNIPPETS ; ^^^^^^^^^^^^^^^^^^^^^^^ ; GetDirectoryTarget() by freak ; PathBarTextWidthApi() [TextbreiteApi] by hjbremer ; ; ****************************************************************************************** Enumeration #PathBar_BackColor ; Hintergrundfarbe der PathBar #PathBar_FillColor ; Füllfarbe der Buttons #PathBar_BorderColor ; Farbe des Randes #PathBar_TextColor ; Farbe des Textes #PathBar_ArrowColor ; Farbe der Pfeile #PathBar_BlindColor ; Disablefarbe #PathBar_ColorEnd ; muss hinten stehen EndEnumeration Structure PathBars iID.i ; Nummer vom ContainerGadget iTyp.i ; #PathBar_Button ... iHeight.i ; Höhe iWidth.i ; Breite iFont.i ; Schrift iAnz.i ; Anzahl Buttons iAkt.i ; aktueller Button, wenn Popup-Menü offen ist iVon.i ; erster eingeblendeter Button, wenn Platz zu klein für alle iBis.i ; letzter eingeblendeter Button, wenn Platz zu klein für alle iWin.i ; Nummer des übergeordneten Fensters iLeftGadget.i ; linker "Doppelpfeil", wenn Platz zu klein für alle iRightGadget.i ; rechter "Doppelpfeil", wenn Platz zu klein für alle iMenu.i ; Menünummer des Popupmenüs iWinEG.i ; Hintergrundfenster für ListIcon alColor.l[#PathBar_ColorEnd] ; Farben aiGadget.i[#MAX_PATH] ; Feld für die Gadgetnummern der Buttons asText.s[#MAX_PATH] ; Feld für die Texte der Buttons asGadgetText.s[#MAX_PATH] ; Feld für die Texte der Buttons aiUhrIcon.i[60] iIconAnz.i iUhrZeit.i EndStructure ;########################################################################### ; user: freak ; forum: http://www.purebasic.fr/english/viewtopic.php?t=6352 ; ; SHFILEINFO structure is incorrect in PB, got to go fix that... Structure MySHFILEINFO hIcon.l iIcon.l dwAttributes.l szDisplayName.b[#MAX_PATH] szTypeName.b[80] EndStructure Procedure PathBarGetIcon (sPath.s) Protected Info.MySHFILEINFO If SHGetFileInfo_(sPath, 0, @Info.MySHFILEINFO, SizeOf(MySHFILEINFO), #SHGFI_ICON|#SHGFI_LARGEICON) ProcedureReturn Info\hIcon EndIf ; DestroyIcon_(IconHandle) ProcedureReturn 0 EndProcedure ;############################################################################ ; WinIoCtl.h ; #FILE_DEVICE_FILE_SYSTEM = $00000009 #METHOD_BUFFERED = 0 #FILE_ANY_ACCESS = 0 #FILE_SPECIAL_ACCESS = (#FILE_ANY_ACCESS) Macro CTL_CODE( DeviceType, Function, Method, Access ) (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) EndMacro #FSCTL_SET_REPARSE_POINT = CTL_CODE(#FILE_DEVICE_FILE_SYSTEM, 41, #METHOD_BUFFERED, #FILE_SPECIAL_ACCESS) #FSCTL_GET_REPARSE_POINT = CTL_CODE(#FILE_DEVICE_FILE_SYSTEM, 42, #METHOD_BUFFERED, #FILE_ANY_ACCESS) #FSCTL_DELETE_REPARSE_POINT = CTL_CODE(#FILE_DEVICE_FILE_SYSTEM, 43, #METHOD_BUFFERED, #FILE_SPECIAL_ACCESS) ; Winbase.h ; #FILE_FLAG_OPEN_REPARSE_POINT = $00200000 ; WinNT.h ; #IO_REPARSE_TAG_MOUNT_POINT = $A0000003 #IO_REPARSE_TAG_HSM = $C0000004 #IO_REPARSE_TAG_HSM2 = $80000006 #IO_REPARSE_TAG_SIS = $80000007 #IO_REPARSE_TAG_DFS = $8000000A #IO_REPARSE_TAG_SYMLINK = $A000000C #IO_REPARSE_TAG_DFSR = $80000012 ; From Windows Driver Kit. ; http://msdn.microsoft.com/en-us/library/ms791514.aspx ; Structure SymbolicLinkReparseBuffer SubstituteNameOffset.w SubstituteNameLength.w PrintNameOffset.w PrintNameLength.w Flags.l PathBuffer.w[1] EndStructure Structure MountPointReparseBuffer SubstituteNameOffset.w SubstituteNameLength.w PrintNameOffset.w PrintNameLength.w PathBuffer.w[1] EndStructure Structure GenericReparseBuffer DataBuffer.b[1] EndStructure Structure REPARSE_DATA_BUFFER ReparseTag.l ReparseDataLength.w Reserved.w StructureUnion SymbolicLinkReparseBuffer.SymbolicLinkReparseBuffer MountPointReparseBuffer.MountPointReparseBuffer GenericReparseBuffer.GenericReparseBuffer EndStructureUnion EndStructure ; Tries to follow a directory link on Windows Vista (should also work for files) ; ; - If the directory is no link, the result is the original directory ; - If the target cannot be read, the result is "" ; Procedure.s GetDirectoryTarget(Directory$) ; ***************************************************** ; Originale Funktion von freak: ; http://www.purebasic.fr/german/viewtopic.php?t=19668 ; ***************************************************** Protected TokenHandle, BufferSize, hDirectory, BytesReturned.l Protected Privileges.TOKEN_PRIVILEGES Protected *Buffer.REPARSE_DATA_BUFFER Protected Result$ = "" ; Check if the directory is a reparse point (link or mount point) ; If GetFileAttributes_(@Directory$) & #FILE_ATTRIBUTE_REPARSE_POINT ; The backup privilege is required to open a directory for io queries ; So try to set it on our process token. (usually it should be set already) ; If OpenProcessToken_(GetCurrentProcess_(), #TOKEN_ADJUST_PRIVILEGES, @TokenHandle) Privileges\PrivilegeCount = 1 Privileges\Privileges[0]\Attributes = #SE_PRIVILEGE_ENABLED If LookupPrivilegeValue_(#Null, @"SeBackupPrivilege", @Privileges\Privileges[0]\Luid) AdjustTokenPrivileges_(TokenHandle, #False, @Privileges, SizeOf(TOKEN_PRIVILEGES), #Null, #Null) EndIf CloseHandle_(TokenHandle) EndIf ; Open the directory ; Have to pass 0 as access right (not #GENERIC_READ), as it fails otherwise ; http://www.codeproject.com/KB/vista/Windows_Vista.aspx ; hDirectory = CreateFile_(@Directory$, 0, #FILE_SHARE_READ|#FILE_SHARE_WRITE, #Null, #OPEN_EXISTING, #FILE_FLAG_OPEN_REPARSE_POINT | #FILE_FLAG_BACKUP_SEMANTICS, #Null) If hDirectory <> #INVALID_HANDLE_VALUE ; Allocate a buffer for the io query. 1000 bytes should be enough for the real path (in unicode) ; BufferSize = SizeOf(REPARSE_DATA_BUFFER) + 1000 *Buffer = AllocateMemory(BufferSize) If *Buffer ; Query the directory for reparse point information ; If DeviceIoControl_(hDirectory, #FSCTL_GET_REPARSE_POINT, #Null, 0, *Buffer, BufferSize, @BytesReturned, #Null) <> 0 ; Check the kind of reparse point (device drivers can create their own tags, so this is important) ; The "& $FFFFFFFF" is for 64bit, as the tags are negative when interpreted as quads ; If *Buffer\ReparseTag & $FFFFFFFF = #IO_REPARSE_TAG_MOUNT_POINT ; Read the result. The offset and length are in bytes. PeekS needs length in characters ; Result$ = PeekS(@*Buffer\MountPointReparseBuffer\PathBuffer[0] + *Buffer\MountPointReparseBuffer\SubstituteNameOffset, *Buffer\MountPointReparseBuffer\SubstituteNameLength / 2, #PB_Unicode) ElseIf *Buffer\ReparseTag & $FFFFFFFF = #IO_REPARSE_TAG_SYMLINK Result$ = PeekS(@*Buffer\SymbolicLinkReparseBuffer\PathBuffer[0] + *Buffer\SymbolicLinkReparseBuffer\SubstituteNameOffset, *Buffer\SymbolicLinkReparseBuffer\SubstituteNameLength / 2, #PB_Unicode) EndIf EndIf FreeMemory(*Buffer) EndIf CloseHandle_(hDirectory) EndIf Else ; It is not a reparse point, so return the original path ; Result$ = Directory$ EndIf ; Since the result is a unicode directory name, it can have the "\??\" prefix which allows a length of 32767 characters. ; If Left(Result$, 4) = "\??\" Result$ = Right(Result$, Len(Result$)-4) EndIf ProcedureReturn Result$ EndProcedure ;############################################################################ Declare PathBarSetPath(iID.i,sPath.s) Declare.s ProcessPathBarEvent(iEvent.i,*iPB) Declare PathBarStyle(iID.i,iStyle.i) Declare.s PathBarGetPath(iID.i,iBis.i) Declare SetPathBarFont(iID.i,iFont.i) Declare ResizePathBar(iID.i,iX.i,iY.i,iWidth.i,iHeight.i) Declare AddPathBarButton(iID.i,sText.s) Declare SizePathBar(iID.i,iAnf.i,iEnd.i) Declare AddPathBarRoot(iID.i,sText.s) Declare PathBarArrow(iID.i,iNew.i,iTyp.i,iGadget.i,iArrow.i,iX.i,iY.i,iWidth.i,iHeight.i) Declare PathBarButton(iID.i,iNew.i,iTyp.i,iGadget.i,iFont.i,iX.i,iY.i,iWidth.i,iHeight.i,sText.s) Declare ClearPathBar (iID.i,iVon.i) Declare RemovePathBar(iID.i) Declare.i AddPathBar(iWin.i,iID.i,iX.i,iY.i,iWidth.i,iHeight.i) Declare.i PathBarAddElem() Declare PathBarFree(iNr.i=-1) Declare PathBarDrawPfeilButton(iID.i,iTyp.i,iImage.i,iWidth.i,iHeight.i) Declare PathBarDrawButton(iID.i,iImage.i,iFontID.i,iWidth.i,iHeight.i,sText.s) Declare PathBarDrawPfeil2(iX.i,iY.i,iWidth.i,iHeight.i,lColour.l) Declare PathBarDrawPfeil1(iX.i,iY.i,iWidth.i,iHeight.i,lColour.l) Declare PathBarDrawBorder(iX.i,iY.i,iWidth.i,iHeight.i) Declare.i PathBarTextFont(sFont.s="") Declare.i PathBarTextSize(iTyp.i,iText.i,iGadIm.i,iFont.i,sText.s) Declare.i PathBarTextImageSize(iIm.i,iFontID.i,sText.s) Declare PathBarInit() Declare.s PathBarSpecialChar(iTyp.i,sZeichen.s="") Declare.i PathBarSpecialFonts(iNr.i,sFont.s="") Declare.i PathBarTextHeight(iSize.i=0) Declare.i PathBarAnz(iAnz.i=-1) Declare.i PathBarMem(iIni.i,*iMem=#Null) Declare.l PathBarColor(iID.i,iTyp.i=-1,lColor.l=-1) Declare.i PathBarBorderWidth() Declare.i PathBarTextWidthApi(iGadget.i,iFontNr.i,sText.s) Declare.i PathBarListSize (iTyp.i,iSize.i=-1) Enumeration #PathBarSonder_L ; linker "Doppelpfeil" #PathBarSonder_R ; rechter "Doppelpfeil" #PathBarSonder_P ; Pfeil hinter "Text"-Buttons und vor "Laufwerks"-Button #PathBarSonder_U ; Pfeil hinter "Text"-Buttons und vor "Laufwerks"-Button, wenn Popup-Menü auf ist #PathBarSonder_T ; Uhrzeit EndEnumeration Enumeration #PathBar_LeftArrow ; Doppelpfeil nach Links #PathBar_RightArrow ; Doppelpfeil nach Rechts #PathBar_PathArrow ; Pfeil nach Button #PathBar_DownArrow ; Ausgeklappter Pfeil EndEnumeration Enumeration #PathBar_DirListHeight ; Höhe der Liste #PathBar_DirListWidth ; Breite der Liste #PathBar_DriveListHeight ; Höhe der Laufwerksliste #PathBar_DriveListWidth ; Breite der Laufwerksliste EndEnumeration Enumeration #PathBar_Button = 1 ; normaler Button #PathBar_FlatButton = 2 ; flacher Button #PathBar_Image = 4 ; Image-Button #PathBar_Style = 7 ; Stilmaske #PathBar_File = 8 ; Anzeige von Files #PathBar_Dir = 16 ; Anzeige von Ordnern #PathBar_FileDir = 24 ; Anzeige von Files/Ordnern #PathBar_Menu = 32 ; Menü #PathBar_ImageMenu = 64 ; Menü mit Images #PathBar_ExplorerList = 128 ; ExplorerListe #PathBar_ListView = 256 ; ListView-Ansicht #PathBar_MenuForm = 480 ; Menümaske #PathBar_Icons = 512 #PathBar_NoIcons = 1024 #PathBar_NameIcon = 1536 EndEnumeration Enumeration #PathBar_MenuMin #PathBar_MenuMax EndEnumeration EnableExplicit Procedure DrawUhr(iMin.i,iHour.i,iX.i,iY.i,iR.i,lColB.l,lColF.l) Protected Dim fW.f(12) Protected iDx.i,iDy.i fW( 0) = 0.0 fW( 1) = 0.5 fW( 2) = 0.866 fW( 3) = 1.0 fW( 4) = 0.866 fW( 5) = 0.5 fW( 6) = 0.0 fW( 7) = -0.5 fW( 8) = -0.866 fW( 9) = -1.0 fW(10) = -0.866 fW(11) = -0.5 fW(12) = 0.0 DrawingMode(#PB_2DDrawing_Default) Circle(iX,iY,iR,lColB) DrawingMode(#PB_2DDrawing_Outlined) Circle(iX,iY,iR,lColF) iMin / 5 iMin % 12 iDx = fW(iMin)*iR iDy = fW((iMin+9)%12)*iR LineXY(iX,iY,iX+iDx,iY+iDy,lColF) iHour % 12 If iMin = iHour ProcedureReturn EndIf Line (iX,iY,fW(iHour)*iR*0.7,fW((iHour+3)%12)*iR*0.7,lColF) EndProcedure Procedure DrawTime(*PB.PathBars,iNr.i,iImage.i) Static siTime.i = 0 Static siNr.i = 0 If iNr = -1 *PB\aiUhrIcon[*PB\iIconAnz%60] = iImage *PB\iIconAnz + 1 ElseIf iNr = -2 If (*PB\iTyp & #PathBar_Style) = #PathBar_Image Else SetGadgetFont(*PB\aiGadget[*PB\iAkt],FontID(PathBarSpecialFonts(0))) SetGadgetText(*PB\aiGadget[*PB\iAkt],PathBarSpecialChar(#PathBarSonder_U)) EndIf Else If iNr = 0 siTime = ElapsedMilliseconds() siNr = 0 If (*PB\iTyp & #PathBar_Style) <> #PathBar_Image SetGadgetFont(*PB\aiGadget[*PB\iAkt],FontID(PathBarSpecialFonts(1))) EndIf Else If ElapsedMilliseconds()-siTime >= *PB\iUhrZeit siNr + iNr Else ProcedureReturn EndIf EndIf If (*PB\iTyp & #PathBar_Style) = #PathBar_Image If iImage = -1 iImage = GetGadgetData(*PB\aiGadget[*PB\iAkt]) EndIf Protected iMax.i = ImageHeight(iImage) StartDrawing(ImageOutput(iImage)) If iMax > ImageWidth(iImage) iMax = ImageWidth(iImage) EndIf If *PB\iIconAnz > 0 DrawImage(ImageID(*PB\aiUhrIcon[iNr%*PB\iIconAnz]),(ImageWidth(iImage)-iMax)/2,(ImageHeight(iImage)-iMax)/2,iMax,iMax) Else DrawUhr(siNr*5,siNr,ImageWidth(iImage)/2,ImageHeight(iImage)/2,iMax/2-1,*PB\alColor[#PathBar_BackColor],*PB\alColor[#PathBar_ArrowColor]) EndIf StopDrawing() SetGadgetState(*PB\aiGadget[*PB\iAkt],ImageID(iImage)) siTime = ElapsedMilliseconds() Else Protected sText.s = Chr(Asc(PathBarSpecialChar(#PathBarSonder_T))+(siNr%12)) SetGadgetText(*PB\aiGadget[*PB\iAkt],sText) EndIf EndIf EndProcedure Procedure.i PathBarMenuNr(iTyp.i,iNr.i=-1) Static siMenuMin.i = 0 Static siMenuMax.i = -1 If iTyp = #PathBar_MenuMin If iNr > -1 siMenuMin = iNr EndIf ProcedureReturn siMenuMin ElseIf iTyp = #PathBar_MenuMax If iNr > -1 siMenuMax = iNr EndIf ProcedureReturn siMenuMax EndIf ProcedureReturn -1 EndProcedure Procedure.i PathBarTextWidthApi(iGadget.i,iFontNr.i,sText.s) ; ************************************************* ; Ermittelt die Breite des angegebenen Textes für ; die Buttons ; ************************************************* ; ***************************************************** ; Originale Funktion von hjbremer: ; http://www.purebasic.fr/german/viewtopic.php?t=15549 ; ***************************************************** Protected tSize.size Protected hWnd = GadgetID(iGadget) Protected hDC = GetDC_(hWnd) SelectObject_(hDC,FontID(iFontNr)) GetTextExtentPoint32_(hDC,@sText,Len(sText),@tSize) ReleaseDC_(hWnd,hDC) ProcedureReturn tSize\cx EndProcedure Procedure.i PathBarBorderWidth() ; ************************************************* ; Randbreite ermitteln vom Button ; ************************************************* ProcedureReturn GetSystemMetrics_(#SM_CXBORDER) EndProcedure Procedure.i PathBarListSize(iTyp.i,iSize.i=-1) ; ************************************************* ; Speicher- und Abruffunktion für die Directory- ; und Fileliste ; ************************************************* Static siWidth1.i = 50 Static siHeight1.i = 100 Static siWidth2.i = 100 Static siHeight2.i = 150 If iTyp = #PathBar_DriveListHeight If iSize > -1 siHeight1 = iSize EndIf ProcedureReturn siHeight1 ElseIf iTyp = #PathBar_DriveListWidth If iSize > -1 siWidth1 = iSize EndIf ProcedureReturn siWidth1 ElseIf iTyp = #PathBar_DirListHeight If iSize > -1 siHeight2 = iSize EndIf ProcedureReturn siHeight2 ElseIf iTyp = #PathBar_DirListWidth If iSize > -1 siWidth2 = iSize EndIf ProcedureReturn siWidth2 EndIf ProcedureReturn 0 EndProcedure Procedure.i PathBarIconBuffer(iNr.i,iVal.i=-1) ; ************************************************* ; Speicher für Icons von Files und Directorys ; ************************************************* Static *siIcoMem = #Null Static siAnz.i=0 Protected iRet.i = -1 If iNr > -1 If iVal = -1 iRet = PeekI(*siIcoMem+iNr*SizeOf(Integer)) Else If iNr >= siAnz If *siIcoMem = #Null Or (iNr+1)*SizeOf(Integer) > MemorySize(*siIcoMem) *siIcoMem = ReAllocateMemory(*siIcoMem,(iNr+1)*SizeOf(Integer)) EndIf siAnz = iNr+1 EndIf PokeI(*siIcoMem+iNr*SizeOf(Integer),iVal) iRet = iVal EndIf ElseIf iNr = -1 iRet = siAnz ElseIf iNr = -2 Protected i.i For i = 0 To siAnz Step 1 DestroyIcon_(PeekI(*siIcoMem+i*SizeOf(Integer))) Next i FreeMemory(*siIcoMem) *siIcoMem = #Null siAnz = 0 iRet = 0 EndIf ProcedureReturn iRet EndProcedure Procedure.i PathBarGetFileDirAnz(iTyp.i,sPath.s, *PB.PathBars = #Null) ; ************************************************* ; Anzahl der Einträge des aktuellen Pfades ; ************************************************* Protected iDir.i = ExamineDirectory(#PB_Any,sPath,"*.*"), iAnz.i = 0 If iDir While NextDirectoryEntry(iDir) If DirectoryEntryType(iDir) = #PB_DirectoryEntry_Directory And (iTyp & 2) Protected sName.s = DirectoryEntryName(iDir) If sName <> ".." And sName <> "." iAnz + 1 EndIf EndIf If DirectoryEntryType(iDir) = #PB_DirectoryEntry_File And (iTyp & 4) iAnz + 1 EndIf If *PB <> #Null DrawTime(*PB,1,-1) EndIf Wend FinishDirectory(iDir) EndIf ProcedureReturn iAnz EndProcedure Procedure.i PathBarGetFileDir( iTyp.i, sPath.s, Array asName.s(1), *PB.PathBars = #Null) ; ************************************************* ; Einlesen der Directory- und Filenamen zur ; Verwendung in der PathBar ; ************************************************* Protected iAnz.i = 0, j.i, k.i, iIcon1.i, iIcon2.i, iDir.i = 0, iAnzD.i If iTyp & 1 Protected iDrives.i = GetLogicalDrives_() Protected Pkt.point For j = 0 To 31 Step 1 If iDrives & (1< ArraySize(asName()) ReDim asName.s(iAnz+1) EndIf asName(iAnz) = Chr(65 + j) + ":" iIcon1 = PathBarGetIcon(asName(iAnz)+"\") PathBarIconBuffer(iAnz,iIcon1) iAnz + 1 If *PB <> #Null DrawTime(*PB,1,-1) EndIf EndIf Next j EndIf If iTyp & 2 iDir.i = ExamineDirectory(#PB_Any,sPath,"*.*") If iDir While NextDirectoryEntry(iDir) If DirectoryEntryType(iDir) = #PB_DirectoryEntry_Directory If ArraySize(asName()) = iAnz ReDim asName(iAnz+1) EndIf asName(iAnz) = DirectoryEntryName(iDir) If asName(iAnz) <> ".." And asName(iAnz) <> "." iIcon1 = PathBarGetIcon(sPath+asName(iAnz)) PathBarIconBuffer(iAnz,iIcon1) iAnz + 1 EndIf EndIf If *PB <> #Null DrawTime(*PB,1,-1) EndIf Wend FinishDirectory(iDir) For k=0 To iAnz-1 Step 1 For j=k+1 To iAnz-1 Step 1 If asName(j-1) > asName(j) Swap asName(j-1), asName(j) iIcon1 = PathBarIconBuffer(j-1) iIcon2 = PathBarIconBuffer(j) PathBarIconBuffer(j-1,iIcon2) PathBarIconBuffer(j,iIcon1) EndIf Next j If *PB <> #Null DrawTime(*PB,1,-1) EndIf Next k EndIf EndIf iAnzD = iAnz If iTyp & 4 iDir = ExamineDirectory(#PB_Any,sPath,"*.*") If iDir While NextDirectoryEntry(iDir) If DirectoryEntryType(iDir) = #PB_DirectoryEntry_File If ArraySize(asName()) = iAnz ReDim asName(iAnz+1) EndIf asName(iAnz) = DirectoryEntryName(iDir) If asName(iAnz) <> ".." And asName(iAnz) <> "." iIcon1 = PathBarGetIcon(sPath+asName(iAnz)) PathBarIconBuffer(iAnz,iIcon1) iAnz + 1 EndIf EndIf If *PB <> #Null DrawTime(*PB,1,-1) EndIf Wend FinishDirectory(iDir) For k=iAnzD To iAnz-1 Step 1 For j=k+1 To iAnz-1 Step 1 If asName(j-1) > asName(j) Swap asName(j-1), asName(j) iIcon1 = PathBarIconBuffer(j-1) iIcon2 = PathBarIconBuffer(j) PathBarIconBuffer(j-1,iIcon2) PathBarIconBuffer(j,iIcon1) EndIf Next j If *PB <> #Null DrawTime(*PB,1,-1) EndIf Next k EndIf EndIf ProcedureReturn iAnz EndProcedure Procedure.i PathBarMem(iIni.i,*iMem=#Null) ; ************************************************* ; Speicherverwaltung für die PathBar-Strukturen ; ************************************************* Static *siMem = #Null If *iMem <> #Null Or iIni = 1 *siMem = *iMem EndIf ProcedureReturn *siMem EndProcedure Procedure.l PathBarColor(iID.i,iTyp.i=-1,lColor.l=-1) Protected *PB.PathBars = PathBarMem(0) Protected iAnz.i = PathBarAnz(), i.i If iTyp < 0 For i = 0 To iAnz-1 Step 1 If *PB\iID = iID *PB\alColor[#PathBar_BackColor ] = GetSysColor_(#COLOR_3DFACE) *PB\alColor[#PathBar_FillColor ] = GetSysColor_(#COLOR_3DFACE) *PB\alColor[#PathBar_BorderColor] = 0 *PB\alColor[#PathBar_TextColor ] = 0 *PB\alColor[#PathBar_ArrowColor ] = 0 *PB\alColor[#PathBar_BlindColor ] = $A0A0A0 Break EndIf *PB + SizeOf(PathBars) Next i ElseIf iTyp < #PathBar_ColorEnd For i = 0 To iAnz-1 Step 1 If *PB\iID = iID *PB\alColor[iTyp] = lColor Break EndIf *PB + SizeOf(PathBars) Next i EndIf EndProcedure Procedure.i PathBarAnz(iAnz.i=-1) ; ************************************************* ; Speicherung und Bereitstellung der Anzahl aller ; PathBars ; ************************************************* Static siAnz.i = 0 If iAnz <> -1 siAnz = iAnz EndIf ProcedureReturn siAnz EndProcedure Procedure.i PathBarTextHeight(iSize.i=0) ; ************************************************* ; Speicherung und Bereitstellung der Zeichenhöhe ; ************************************************* Static siSize.i = 10 If iSize > 0 siSize = iSize EndIf ProcedureReturn siSize EndProcedure Procedure.i PathBarSpecialFonts(iNr.i,sFont.s="") ; ************************************************* ; Speicherung und Bereitstellung der Sonderzeichen ; auf den Pfeilbuttons ; ************************************************* Static siFont1.i = -1 Static siFont2.i = -1 If sFont <> "" If iNr = 0 siFont1.i = LoadFont(#PB_Any,sFont,PathBarTextHeight()) Else siFont2.i = LoadFont(#PB_Any,sFont,PathBarTextHeight()) EndIf Else If siFont1 = -1 siFont1.i = LoadFont(#PB_Any,"Webdings",PathBarTextHeight()) EndIf If siFont2 = -1 siFont2.i = LoadFont(#PB_Any,"Wingdings",PathBarTextHeight()) EndIf EndIf If iNr = 0 ProcedureReturn siFont1 Else ProcedureReturn siFont2 EndIf EndProcedure Procedure.s PathBarSpecialChar(iTyp.i,sZeichen.s="") ; ************************************************* ; Bereitstellung der Sonderzeichen für die Pfeile ; ************************************************* Static ssL.s=Chr(55) Static ssR.s=Chr(56) Static ssP.s=Chr(52) Static ssU.s=Chr(54) Static ssT.s=Chr(183) If sZeichen <> "" If iTyp = #PathBarSonder_L ssL = sZeichen ElseIf iTyp = #PathBarSonder_R ssR = sZeichen ElseIf iTyp = #PathBarSonder_P ssP = sZeichen ElseIf iTyp = #PathBarSonder_U ssU = sZeichen ElseIf iTyp = #PathBarSonder_T ssT = sZeichen EndIf EndIf If iTyp = #PathBarSonder_L ProcedureReturn ssL ElseIf iTyp = #PathBarSonder_R ProcedureReturn ssR ElseIf iTyp = #PathBarSonder_P ProcedureReturn ssP ElseIf iTyp = #PathBarSonder_U ProcedureReturn ssU ElseIf iTyp = #PathBarSonder_T ProcedureReturn ssT Else ProcedureReturn "" EndIf EndProcedure Procedure PathBarInit() ; ************************************************* ; Initialisierung der PathBar ; ************************************************* If PathBarMem(0) <> #Null If PathBarAnz() > 0 PathBarFree(-1) Else FreeMemory(PathBarMem(0)) PathBarMem(1) EndIf EndIf PathBarAnz(0) EndProcedure Procedure.i PathBarTextImageSize(iIm.i,iFont.i,sText.s) ; ************************************************* ; Ermittelt die Breite des angegebenen Textes für ; die Images ; ************************************************* StartDrawing(ImageOutput(iIm)) If IsFont(iFont) DrawingFont(FontID(iFont)) EndIf Protected iBreite.i = TextWidth(sText) StopDrawing() ProcedureReturn iBreite EndProcedure Procedure.i PathBarTextSize(iTyp.i,iText.i,iGadIm.i,iFont.i,sText.s) ; ************************************************* ; Textbreite ermitteln ; ************************************************* Protected iBreite.i = 0 If iText%2 = 1 If (iTyp & #PathBar_Style) <> #PathBar_Image iBreite = PathBarTextWidthApi(iGadIm,iFont,sText) Else iBreite = PathBarTextImageSize(iGadIm,iFont,sText) EndIf Else If (iTyp & #PathBar_Style) <> #PathBar_Image Protected iFont1.i = PathBarSpecialFonts(0,"") Protected sPfeil.s = PathBarSpecialChar(#PathBarSonder_U) iBreite = PathBarTextWidthApi(iGadIm,iFont1,sPfeil) sPfeil.s = PathBarSpecialChar(#PathBarSonder_P) Protected iSize2 = PathBarTextWidthApi(iGadIm,iFont1,sPfeil) If iSize2 > iBreite iBreite = iSize2 EndIf Else iBreite = (ImageHeight(iGadIm)/5)*4-4-2*PathBarBorderWidth() EndIf EndIf ProcedureReturn iBreite EndProcedure Procedure.i PathBarTextFont(sFont.s="") ; ************************************************* ; Font des Textes für die normalen Buttons ; ************************************************* Static siFont.i = -1 If sFont <> "" siFont.i = LoadFont(#PB_Any,sFont,PathBarTextHeight()) ElseIf siFont = -1 siFont.i = LoadFont(#PB_Any,"",PathBarTextHeight()) EndIf ProcedureReturn siFont EndProcedure Procedure PathBarDrawBorder(iX.i,iY.i,iWidth.i,iHeight.i) ; ************************************************* ; Rand für die ImageButtons ; ************************************************* LineXY(iX+4,iY,iX+iWidth-5,iY) LineXY(iX+iWidth-4,iY,iX+iWidth-1,iY+3) LineXY(iX+iWidth-1,iY+4,iX+iWidth-1,iY+iHeight-5) LineXY(iX+iWidth-1,iY+iHeight-4,iX+iWidth-4,iY+iHeight-1) LineXY(iX+iWidth-5,iY+iHeight-1,iX+4,iY+iHeight-1) LineXY(iX+3,iY+iHeight-1,iX,iY+iHeight-4) LineXY(iX,iY+iHeight-5,iX,iY+4) LineXY(iX,iY+3,iX+3,iY) EndProcedure Procedure PathBarDrawPfeil1(iX.i,iY.i,iWidth.i,iHeight.i,lColour.l) ; ************************************************* ; Zeichnen eines Pfeiles (rechts/links) für die ; ImageButtons ; ************************************************* LineXY(iX,iY,iX+iWidth,iY+iHeight/2) LineXY(iX+iWidth,iY+iHeight/2,iX+iWidth,iY-iHeight/2) LineXY(iX+iWidth,iY-iHeight/2,iX,iY) FillArea(iX+iWidth/2,iY,lColour,lColour) EndProcedure Procedure PathBarDrawPfeil2(iX.i,iY.i,iWidth.i,iHeight.i,lColour.l) ; ************************************************* ; Zeichnen eines Pfeiles (oben/unten) für die ; ImageButtons ; ************************************************* LineXY(iX,iY,iX+iWidth/2,iY+iHeight) LineXY(iX+iWidth/2,iY+iHeight,iX-iWidth/2,iY+iHeight) LineXY(iX-iWidth/2,iY+iHeight,iX,iY) FillArea(iX,iY+iHeight/2,lColour,lColour) EndProcedure Procedure PathBarDrawButton(iID.i,iImage.i,iFontID.i,iWidth.i,iHeight.i,sText.s) ; ************************************************* ; Zeichnen des ImageButtons ; ************************************************* Protected *PB.PathBars = PathBarMem(0) Protected iAnz.i = PathBarAnz(), i.i For i = 0 To iAnz - 1 If *PB\iID = iID StartDrawing(ImageOutput(iImage)) DrawingMode(#PB_2DDrawing_Default) DrawingFont(iFontID) Protected iTextBreite.i = TextWidth(sText) Protected iTextHoehe.i = TextHeight(sText) Box(0,0,iWidth,iHeight,*PB\alColor[#PathBar_BackColor]) FrontColor(*PB\alColor[#PathBar_BorderColor]) PathBarDrawBorder(0,0,iWidth,iHeight) FillArea(iWidth/2,iHeight/2,*PB\alColor[#PathBar_BorderColor],*PB\alColor[#PathBar_FillColor]) DrawingMode(#PB_2DDrawing_Transparent) DrawText((iWidth-iTextBreite)/2,(iHeight-iTextHoehe)/2,sText,*PB\alColor[#PathBar_TextColor]) StopDrawing() EndIf *PB + SizeOf(PathBars) Next i EndProcedure Procedure PathBarDrawPfeilButton(iID.i,iTyp.i,iImage.i,iWidth.i,iHeight.i) ; ************************************************* ; Zeichenen des Pfeil-ImageButtons ; ************************************************* Protected *PB.PathBars = PathBarMem(0) Protected iAnz.i = PathBarAnz(), i.i For i = 0 To iAnz - 1 If *PB\iID = iID Break EndIf *PB + SizeOf(PathBars) Next i If i = iAnz ProcedureReturn 0 EndIf If iTyp & 256 Protected lCol.l = *PB\alColor[#PathBar_BlindColor] Else lCol = *PB\alColor[#PathBar_ArrowColor] EndIf iTyp & 255 StartDrawing(ImageOutput(iImage)) Box(0,0,iWidth,iHeight,*PB\alColor[#PathBar_BackColor]) FrontColor(*PB\alColor[#PathBar_BorderColor]) PathBarDrawBorder(0,0,iWidth,iHeight) FillArea(2,iWidth/2,*PB\alColor[#PathBar_BorderColor],*PB\alColor[#PathBar_FillColor]) FrontColor(lCol) If iTyp = 1 Protected iBr.i = (iWidth-4)/3 If iWidth-3*iBr-4 > 0 Protected iR.i = 1 Else iR = 0 EndIf PathBarDrawPfeil1(iWidth-2-iBr-iR,iHeight/2,-iBr,iHeight/3,lCol) ElseIf iTyp = 2 iBr = (iWidth-4)/3 PathBarDrawPfeil1(2+iBr,iHeight/2,iBr,iHeight/3,lCol) ElseIf iTyp = 3 iBr = (iWidth-4)/4 If iWidth-4*iBr-4 > 0 iR = 1 Else iR = 0 EndIf PathBarDrawPfeil1(iWidth-2-iBr-iR,iHeight/2,-iBr,iHeight/3,lCol) PathBarDrawPfeil1(iWidth-3-2*iBr-iR,iHeight/2,-iBr,iHeight/3,lCol) ElseIf iTyp = 4 iBr = (iWidth-4)/4 PathBarDrawPfeil1(2+iBr,iHeight/2,iBr,iHeight/3,lCol) PathBarDrawPfeil1(3+2*iBr,iHeight/2,iBr,iHeight/3,lCol) ElseIf iTyp = 5 Protected iH.i = iHeight/5 PathBarDrawPfeil2(iWidth/2,3*iH,iWidth-8,-iH,lCol) EndIf StopDrawing() EndProcedure Procedure PathBarFree(iNr.i=-1) ; ************************************************* ; Freigabe aller PathBars ab der angegebenen ; Nummer ; ************************************************* Protected *Mem.PathBars = PathBarMem(0) Protected iAnz.i = PathBarAnz(), i.i, j.i If iNr = -1 For i = iAnz-1 To 0 Step -1 PathBarFree(i) Next i If *Mem <> #Null FreeMemory(*Mem) EndIf ElseIf iNr < iAnz Protected *Mem1.PathBars,*Mem2.PathBars Protected iImage.i *Mem1 = *Mem + iNr * SizeOf(PathBars) If IsGadget(*Mem1\iLeftGadget) iImage = GetGadgetData(*Mem1\iLeftGadget) If IsImage(iImage) FreeImage(iImage) EndIf FreeGadget(*Mem1\iLeftGadget) EndIf If IsGadget(*Mem1\iRightGadget) iImage = GetGadgetData(*Mem1\iRightGadget) If IsImage(iImage) FreeImage(iImage) EndIf FreeGadget(*Mem1\iRightGadget) EndIf For i = 0 To *Mem1\iAnz-1 Step 1 iImage = GetGadgetData(*Mem1\aiGadget[i]) If IsImage(iImage) FreeImage(iImage) EndIf FreeGadget(*Mem1\aiGadget[i]) Next i For i = iNr+1 To iAnz-1 Step 1 *Mem2 = *Mem + (i + 1) * SizeOf(PathBars) *Mem1 = *Mem + i * SizeOf(PathBars) *Mem1\iID = *Mem2\iID *Mem1\iHeight = *Mem2\iHeight *Mem1\iWidth = *Mem2\iWidth *Mem1\iFont = *Mem2\iFont *Mem1\iAnz = *Mem2\iAnz *Mem1\iAkt = *Mem2\iAkt *Mem1\iVon = *Mem2\iVon *Mem1\iBis = *Mem2\iBis *Mem1\iWin = *Mem2\iWin *Mem1\iLeftGadget = *Mem2\iLeftGadget *Mem1\iRightGadget = *Mem2\iRightGadget *Mem1\iMenu = *Mem2\iMenu For j = 0 To *Mem1\iAnz Step 1 *Mem1\aiGadget[j] = *Mem2\aiGadget[j] *Mem1\asText[j] = *Mem2\asText[j] *Mem1\asGadgetText[j] = *Mem2\asGadgetText[j] Next j Next i PathBarAnz(iAnz-1) EndIf EndProcedure Procedure.i PathBarAddElem() ; ************************************************* ; Speicher für eine PathBar reservieren ; ************************************************* Protected iAnz.i = PathBarAnz() If iAnz = 0 Protected *Mem.PathBars = AllocateMemory(SizeOf(PathBars)) PathBarMem(1,*Mem) Else *Mem = PathBarMem(0) EndIf If MemorySize(*Mem)/SizeOf(PathBars) <= iAnz+1 PathBarMem(0,ReAllocateMemory(*Mem,(iAnz+1)*SizeOf(PathBars))) EndIf *Mem = PathBarMem(0) + iAnz * SizeOf(PathBars) PathBarAnz(iAnz+1) ProcedureReturn *Mem EndProcedure Procedure.i AddPathBar(iWin.i,iID.i,iX.i,iY.i,iWidth.i,iHeight.i) ; ************************************************* ; Eine PathBar hinzufügen ; ************************************************* Protected *PB.PathBars = PathBarAddElem() If *PB <> #Null *PB\iID = iID *PB\iTyp = #PathBar_Button | #PathBar_Dir | #PathBar_Menu *PB\iHeight = iHeight *PB\iWidth = iWidth *PB\iFont = PathBarTextFont("") *PB\iAnz = 0 *PB\iAkt = -1 *PB\iVon = -1 *PB\iBis = -1 *PB\iLeftGadget = -1 *PB\iRightGadget = -1 *PB\iMenu = -1 *PB\iWinEG = -1 *PB\iWin = iWin *PB\iIconAnz = 0 *PB\iUhrZeit = 100 PathBarColor(iID,-1) If UseGadgetList(WindowID(iWin)) Protected iGadget = ContainerGadget(iID,iX,iY,iWidth,iHeight) ; Container zum Erstellen anlegen CloseGadgetList() If iID = #PB_Any SetGadgetColor(iGadget,#PB_Gadget_BackColor,*PB\alColor[#PathBar_BackColor]) Else SetGadgetColor(iID ,#PB_Gadget_BackColor,*PB\alColor[#PathBar_BackColor]) EndIf EndIf ProcedureReturn iGadget Else ProcedureReturn -1 EndIf EndProcedure Procedure RemovePathBar(iID.i) ; ************************************************* ; Die angegebene PathBar entfernen und freigeben ; ************************************************* Protected *PB.PathBars = PathBarMem(0) Protected iAnz.i = PathBarAnz() Protected i.i For i=0 To iAnz-1 Step 1 If *PB\iID = iID PathBarFree(i) FreeGadget(iID) Break EndIf *PB + SizeOf(PathBars) Next i EndProcedure Procedure ClearPathBar (iID.i,iVon.i) ; ************************************************* ; Inhalt der angegebenen PathBar löschen ; ************************************************* Protected *PB.PathBars = PathBarMem(0) Protected iAnz.i = PathBarAnz() Protected i.i, iImage.i For i=0 To iAnz-1 Step 1 If *PB\iID = iID If IsGadget(*PB\iLeftGadget) iImage = GetGadgetData(*PB\iLeftGadget) If IsImage(iImage) FreeImage(iImage) EndIf FreeGadget(*PB\iLeftGadget) *PB\iLeftGadget = -1 EndIf If IsGadget(*PB\iRightGadget) iImage = GetGadgetData(*PB\iRightGadget) If IsImage(iImage) FreeImage(iImage) EndIf FreeGadget(*PB\iRightGadget) *PB\iRightGadget = -1 EndIf For i = iVon To *PB\iAnz-1 iImage = GetGadgetData(*PB\aiGadget[i]) If IsImage(iImage) FreeImage(iImage) EndIf FreeGadget(*PB\aiGadget[i]) *PB\aiGadget[i] = -1 Next i *PB\iAnz = iVon *PB\iVon = 0 *PB\iBis = iVon-1 Break EndIf *PB + SizeOf(PathBars) Next i EndProcedure Procedure PathBarButton(iID.i,iNew.i,iTyp.i,iGadget.i,iFont.i,iX.i,iY.i,iWidth.i,iHeight.i,sText.s) ; ************************************************* ; Neu Zeichnen eines PathBarButtons bei ; Veränderung ; ************************************************* If (iTyp & #PathBar_Style) = #PathBar_Button If iNew = #True iGadget = ButtonGadget(#PB_Any,iX,iY,iWidth,iHeight,sText) SetGadgetFont(iGadget,FontID(iFont)) SetGadgetData(iGadget,iGadget) Else SetGadgetText(iGadget,sText) ResizeGadget(iGadget,iX,iY,iWidth,iHeight) EndIf ElseIf (iTyp & #PathBar_Style) = #PathBar_FlatButton If iNew = #True iGadget = ButtonGadget(#PB_Any,iX,iY,iWidth,iHeight,sText,#BS_FLAT) ; Seperator SetGadgetFont(iGadget,FontID(iFont)) SetGadgetColor(iGadget,#PB_Gadget_FrontColor,PathBarColor(#PathBar_TextColor)) SetGadgetColor(iGadget,#PB_Gadget_BackColor ,PathBarColor(#PathBar_FillColor)) SetGadgetData(iGadget,iGadget) Else SetGadgetText(iGadget,sText) ResizeGadget(iGadget,iX,iY,iWidth,iHeight) EndIf Else If iNew = #True Protected iIm.i = CreateImage(#PB_Any,iWidth,iHeight,32) iGadget = ImageGadget(#PB_Any,iX,iY,iWidth,iHeight,ImageID(iIm)) PathBarDrawButton(iID,iIm,FontID(iFont),iWidth,iHeight,sText) SetGadgetData(iGadget,iIm) SetGadgetState(iGadget,ImageID(iIm)) Else iIm = GetGadgetData(iGadget) ResizeImage(iIm,iWidth,iHeight) ResizeGadget(iGadget,iX,iY,iWidth,iHeight) PathBarDrawButton(iID,iIm,FontID(iFont),iWidth,iHeight,sText) SetGadgetState(iGadget,ImageID(iIm)) EndIf EndIf ProcedureReturn iGadget EndProcedure Procedure PathBarArrow(iID.i,iNew.i,iTyp.i,iGadget.i,iArrow.i,iX.i,iY.i,iWidth.i,iHeight.i) ; ************************************************* ; Hinzufügen eines PathBar-Pfeilbuttons ; ************************************************* If iArrow = #PathBar_PathArrow If (iTyp & #PathBar_Style) = #PathBar_Button If iNew = #True Protected iFont.i = PathBarSpecialFonts(0,"") Protected sPfeil.s = PathBarSpecialChar(#PathBarSonder_P) iGadget = ButtonGadget(#PB_Any,iX,iY,iWidth,iHeight,sPfeil) ; Seperator SetGadgetFont(iGadget,FontID(iFont)) ; Font setzen - Webdings SetGadgetData(iGadget,iGadget) Else ResizeGadget(iGadget,iX,iY,iWidth,iHeight) SetGadgetText(iGadget,PathBarSpecialChar(#PathBarSonder_P)) EndIf ElseIf (iTyp & #PathBar_Style) = #PathBar_FlatButton If iNew = #True iFont.i = PathBarSpecialFonts(0,"") sPfeil.s = PathBarSpecialChar(#PathBarSonder_P) iGadget = ButtonGadget(#PB_Any,iX,iY,iWidth,iHeight,sPfeil,#BS_FLAT) ; Seperator SetGadgetFont(iGadget,FontID(iFont)) ; Font setzen - Webdings SetGadgetData(iGadget,iGadget) Else ResizeGadget(iGadget,iX,iY,iWidth,iHeight) SetGadgetText(iGadget,PathBarSpecialChar(#PathBarSonder_P)) EndIf Else If iNew = #True Protected iIm.i = CreateImage(#PB_Any,iWidth,iHeight,32) PathBarDrawPfeilButton(iID,1,iIm,iWidth,iHeight) iGadget = ImageGadget(#PB_Any,iX,iY,iWidth,iHeight,ImageID(iIm)) SetGadgetData(iGadget,iIm) Else iIm = GetGadgetData(iGadget) ResizeImage(iIm,iWidth,iHeight) ResizeGadget(iGadget,iX,iY,iWidth,iHeight) PathBarDrawPfeilButton(iID,1,iIm,iWidth,iHeight) EndIf EndIf ElseIf iArrow = #PathBar_LeftArrow If (iTyp & #PathBar_Style) = #PathBar_Button If iNew = #True iFont.i = PathBarSpecialFonts(0,"") sPfeil.s = PathBarSpecialChar(#PathBarSonder_L) iGadget = ButtonGadget(#PB_Any,iX,iY,iWidth,iHeight,sPfeil) ; Seperator SetGadgetFont(iGadget,FontID(iFont)) ; Font setzen - Webdings SetGadgetData(iGadget,iGadget) Else ResizeGadget(iGadget,iX,iY,iWidth,iHeight) SetGadgetText(iGadget,PathBarSpecialChar(#PathBarSonder_L)) EndIf ElseIf (iTyp & #PathBar_Style) = #PathBar_FlatButton If iNew = #True iFont.i = PathBarSpecialFonts(0,"") sPfeil.s = PathBarSpecialChar(#PathBarSonder_L) iGadget = ButtonGadget(#PB_Any,iX,iY,iWidth,iHeight,sPfeil,#BS_FLAT) ; Seperator SetGadgetFont(iGadget,FontID(iFont)) ; Font setzen - Webdings SetGadgetData(iGadget,iGadget) Else ResizeGadget(iGadget,iX,iY,iWidth,iHeight) SetGadgetText(iGadget,PathBarSpecialChar(#PathBarSonder_L)) EndIf Else If iNew = #True iIm.i = CreateImage(#PB_Any,iWidth,iHeight,32) PathBarDrawPfeilButton(iID,3,iIm,iWidth,iHeight) iGadget = ImageGadget(#PB_Any,iX,iY,iWidth,iHeight,ImageID(iIm)) SetGadgetData(iGadget,iIm) Else iIm = GetGadgetData(iGadget) ResizeImage(iIm,iWidth,iHeight) ResizeGadget(iGadget,iX,iY,iWidth,iHeight) PathBarDrawPfeilButton(iID,3,iIm,iWidth,iHeight) EndIf EndIf ElseIf iArrow = #PathBar_RightArrow If (iTyp & #PathBar_Style) = #PathBar_Button If iNew = #True iFont.i = PathBarSpecialFonts(0,"") sPfeil.s = PathBarSpecialChar(#PathBarSonder_R) iGadget = ButtonGadget(#PB_Any,iX,iY,iWidth,iHeight,sPfeil) ; Seperator SetGadgetFont(iGadget,FontID(iFont)) ; Font setzen - Webdings SetGadgetData(iGadget,iGadget) Else ResizeGadget(iGadget,iX,iY,iWidth,iHeight) SetGadgetText(iGadget,PathBarSpecialChar(#PathBarSonder_R)) EndIf ElseIf (iTyp & #PathBar_Style) = #PathBar_FlatButton If iNew = #True iFont.i = PathBarSpecialFonts(0,"") sPfeil.s = PathBarSpecialChar(#PathBarSonder_R) iGadget = ButtonGadget(#PB_Any,iX,iY,iWidth,iHeight,sPfeil,#BS_FLAT) ; Seperator SetGadgetFont(iGadget,FontID(iFont)) ; Font setzen - Webdings SetGadgetData(iGadget,iGadget) Else ResizeGadget(iGadget,iX,iY,iWidth,iHeight) SetGadgetText(iGadget,PathBarSpecialChar(#PathBarSonder_R)) EndIf Else If iNew = #True iIm.i = CreateImage(#PB_Any,iWidth,iHeight,32) PathBarDrawPfeilButton(iID,4,iIm,iWidth,iHeight) iGadget = ImageGadget(#PB_Any,iX,iY,iWidth,iHeight,ImageID(iIm)) SetGadgetData(iGadget,iIm) Else iIm = GetGadgetData(iGadget) ResizeImage(iIm,iWidth,iHeight) ResizeGadget(iGadget,iX,iY,iWidth,iHeight) PathBarDrawPfeilButton(iID,4,iIm,iWidth,iHeight) EndIf EndIf ElseIf iArrow = #PathBar_DownArrow If (iTyp & #PathBar_Style) = #PathBar_Button If iNew = #True iFont.i = PathBarSpecialFonts(0,"") sPfeil.s = PathBarSpecialChar(#PathBarSonder_U) iGadget = ButtonGadget(#PB_Any,iX,iY,iWidth,iHeight,sPfeil) ; Seperator SetGadgetFont(iGadget,FontID(iFont)) ; Font setzen - Webdings SetGadgetData(iGadget,iGadget) Else ResizeGadget(iGadget,iX,iY,iWidth,iHeight) SetGadgetText(iGadget,PathBarSpecialChar(#PathBarSonder_U)) EndIf ElseIf (iTyp & #PathBar_Style) = #PathBar_FlatButton If iNew = #True iFont.i = PathBarSpecialFonts(0,"") sPfeil.s = PathBarSpecialChar(#PathBarSonder_U) iGadget = ButtonGadget(#PB_Any,iX,iY,iWidth,iHeight,sPfeil,#BS_FLAT) ; Seperator SetGadgetFont(iGadget,FontID(iFont)) ; Font setzen - Webdings SetGadgetData(iGadget,iGadget) Else ResizeGadget(iGadget,iX,iY,iWidth,iHeight) SetGadgetText(iGadget,PathBarSpecialChar(#PathBarSonder_U)) EndIf Else If iNew = #True iIm.i = CreateImage(#PB_Any,iWidth,iHeight,32) PathBarDrawPfeilButton(iID,5,iIm,iWidth,iHeight) iGadget = ImageGadget(#PB_Any,iX,iY,iWidth,iHeight,ImageID(iIm)) SetGadgetData(iGadget,iIm) Else iIm = GetGadgetData(iGadget) ResizeImage(iIm,iWidth,iHeight) ResizeGadget(iGadget,iX,iY,iWidth,iHeight) PathBarDrawPfeilButton(iID,5,iIm,iWidth,iHeight) EndIf EndIf Else ProcedureReturn -1 EndIf If iTyp & #PathBar_Image SetGadgetState(iGadget,ImageID(iIm)) EndIf ProcedureReturn iGadget EndProcedure Procedure AddPathBarRoot(iID.i,sText.s) ; ************************************************* ; Erstellen des Grundverzeichnis-Buttons ; ************************************************* Protected *PB.PathBars = PathBarMem(0) Protected iAnz.i = PathBarAnz() Protected i.i, iX.i=0, iIm.i For i=0 To iAnz-1 Step 1 If *PB\iID = iID Protected iHeight.i = GadgetHeight(iID) If (*PB\iTyp & #PathBar_Style) <> #PathBar_Image Protected iWidth.i = PathBarTextWidthApi(iID,PathBarSpecialFonts(0),PathBarSpecialChar(#PathBarSonder_P))+2*PathBarBorderWidth()+4 Else iWidth.i = (iHeight/5)*4-4-2*PathBarBorderWidth() EndIf If OpenGadgetList(*PB\iID) Protected iPBSep.i = PathBarArrow(*PB\iID,#True,*PB\iTyp,#PB_Any,#PathBar_PathArrow,iX,0,iWidth,*PB\iHeight) ; Seperator iX + GadgetWidth(iPBSep) + 1 *PB\aiGadget[*PB\iAnz] = iPBSep *PB\asText[*PB\iAnz] = ">" *PB\iAnz + 1 iIm = GetGadgetData(iPBSep) Protected iRootButton.i = PathBarButton(*PB\iID,#True,*PB\iTyp,#PB_Any,*PB\iFont,iX,0,PathBarTextSize(*PB\iTyp,1,iIm,*PB\iFont,sText)+2*PathBarBorderWidth()+4,*PB\iHeight,sText) ; Grundverzeichnis-Button, Default eingestellt iX + GadgetWidth(iRootButton) + 1 ; neue X-Position zum Beginnen eines neuen Pathbar-Objektes *PB\aiGadget[*PB\iAnz] = iRootButton *PB\asGadgetText[*PB\iAnz] = sText *PB\asText[*PB\iAnz] = sText *PB\iAnz + 1 iPBSep = PathBarArrow(*PB\iID,#True,*PB\iTyp,#PB_Any,#PathBar_PathArrow,iX,0,iWidth,*PB\iHeight) ; Seperator *PB\aiGadget[*PB\iAnz] = iPBSep *PB\asText[*PB\iAnz] = ">" *PB\iAnz + 1 CloseGadgetList() ProcedureReturn iRootButton EndIf EndIf *PB + SizeOf(PathBars) Next i EndProcedure Procedure SizePathBar(iID.i,iAnf.i,iEnd.i) ; ************************************************* ; Buttons innerhalb einer PathBar anordnen ; ************************************************* Protected sPfeilL.s = PathBarSpecialChar(#PathBarSonder_L), sPfeilR.s = PathBarSpecialChar(#PathBarSonder_R), sGadgetText.s Protected iFind.i = 0, iBreite.i = 0, i.i, iRest.i, iPosX, iFont.i = PathBarSpecialFonts(0,""), iHeight.i = GadgetHeight(iID), iImage.i Protected *PB.PathBars = PathBarMem(0) Protected iAnz.i = PathBarAnz() For i=0 To iAnz-1 Step 1 If *PB\iID = iID iFind = 1 Break EndIf *PB + SizeOf(PathBars) Next i If iFind If (*PB\iTyp & #PathBar_Style) <> #PathBar_Image Protected iBrPfL.i = PathBarTextWidthApi(iID,iFont,sPfeilL)+2*PathBarBorderWidth()+4 Protected iBrPfR.i = PathBarTextWidthApi(iID,iFont,sPfeilR)+2*PathBarBorderWidth()+4 Else iBrPfL = (iHeight/5)*4 iBrPfR = iBrPfL EndIf iFind = -1 Protected iAllWidth.i = 0, iGdIm.i For i=0 To *PB\iAnz-1 Step 1 iGdIm = GetGadgetData(*PB\aiGadget[i]) iBreite = PathBarTextSize(*PB\iTyp,i,iGdIm,*PB\iFont,*PB\asText[i])+2*PathBarBorderWidth()+4 *PB\asGadgetText[i] = *PB\asText[i] ResizeGadget(*PB\aiGadget[i],#PB_Ignore,#PB_Ignore,iBreite,#PB_Ignore) iAllWidth + GadgetWidth(*PB\aiGadget[i]) + 1 Next i If iAllWidth > GadgetWidth(iID) iBreite = iBrPfL + iBrPfR + GadgetWidth(*PB\aiGadget[0]) + 1 If iEnd <> -1 If iEnd = 0 iEnd + 2 EndIf For i = iEnd To 2 Step -2 If iBreite + GadgetWidth(*PB\aiGadget[i]) + 1 > GadgetWidth(iID) iAnf = i+1 iFind = i Break EndIf iBreite + GadgetWidth(*PB\aiGadget[i]) + 1 If i = 2 If iBreite + GadgetWidth(*PB\aiGadget[0]) + 1 > GadgetWidth(iID) iAnf = i+1 iFind = i Break EndIf iBreite + GadgetWidth(*PB\aiGadget[0]) + 1 EndIf sGadgetText = *PB\asText[i-1] If iBreite + GadgetWidth(*PB\aiGadget[i-1]) + 1 > GadgetWidth(iID) If iFind = -1 iRest = GadgetWidth(iID) - iBreite - 2 sGadgetText + "..." iGdIm = GetGadgetData(*PB\aiGadget[i-1]) While PathBarTextSize(*PB\iTyp,1,iGdIm,*PB\iFont,sGadgetText)+2*PathBarBorderWidth()+4 > iRest sGadgetText = Left(sGadgetText,Len(sGadgetText)-4)+"..." If Len(sGadgetText) <= 3 Break EndIf Wend If Len(sGadgetText) <= 3 iAnf = i+1 iFind = i Break EndIf EndIf *PB\asGadgetText[i-1] = sGadgetText iAnf = i-1 iFind = i Break Else *PB\asGadgetText[i-1] = sGadgetText EndIf iBreite + GadgetWidth(*PB\aiGadget[i-1]) + 1 Next i If iFind = -1 iFind = 0 EndIf Else If iAnf = *PB\iAnz-1 iAnf - 2 EndIf For i = iAnf To *PB\iAnz-1 Step 2 If i = 0 If iBreite + GadgetWidth(*PB\aiGadget[0]) + 1 > GadgetWidth(iID) iEnd = i-1 iFind = i Break EndIf iBreite + GadgetWidth(*PB\aiGadget[0]) + 1 i + 1 EndIf If iBreite + GadgetWidth(*PB\aiGadget[i+1]) + 1 > GadgetWidth(iID) iEnd = i-1 iFind = i Break EndIf iBreite + GadgetWidth(*PB\aiGadget[i+1]) + 1 sGadgetText = *PB\asText[i] If iBreite + GadgetWidth(*PB\aiGadget[i]) + 1 > GadgetWidth(iID) If iFind = -1 iRest = GadgetWidth(iID) - iBreite - 1 sGadgetText + "..." iGdIm = GetGadgetData(*PB\aiGadget[i-1]) While PathBarTextSize(*PB\iTyp,1,iGdIm,*PB\iFont,sGadgetText)+2*PathBarBorderWidth()+4 > iRest sGadgetText = Left(sGadgetText,Len(sGadgetText)-4)+"..." If Len(sGadgetText) <= 3 Break EndIf Wend If Len(sGadgetText) <= 3 iEnd = i-1 iFind = i Break EndIf EndIf *PB\asGadgetText[i] = sGadgetText iEnd = i+1 iFind = i Break Else *PB\asGadgetText[i] = sGadgetText EndIf iBreite + GadgetWidth(*PB\aiGadget[i]) + 1 Next i If iFind = -1 iFind = *PB\iAnz-1 EndIf EndIf If iAnf = 0 And iEnd = *PB\iAnz-1 iBreite = 0 For i = iAnf To *PB\iAnz-1 Step 2 If i = 0 iBreite + GadgetWidth(*PB\aiGadget[0]) + 1 i + 1 EndIf iBreite + GadgetWidth(*PB\aiGadget[i+1]) + 1 sGadgetText = *PB\asText[i] If iBreite + GadgetWidth(*PB\aiGadget[i]) + 1 > GadgetWidth(iID) iRest = GadgetWidth(iID) - iBreite - 1 sGadgetText + "..." iGdIm = GetGadgetData(*PB\aiGadget[i-1]) While PathBarTextSize(*PB\iTyp,1,iGdIm,*PB\iFont,sGadgetText)+2*PathBarBorderWidth()+4 > iRest sGadgetText = Left(sGadgetText,Len(sGadgetText)-4)+"..." If Len(sGadgetText) <= 3 Break EndIf Wend *PB\asGadgetText[i] = sGadgetText Break Else *PB\asGadgetText[i] = sGadgetText EndIf iBreite + GadgetWidth(*PB\aiGadget[i]) + 1 Next i *PB\iVon = 0 *PB\iBis = *PB\iAnz-1 iFind = -1 EndIf Else iAnf = 0 iEnd = *PB\iAnz-1 EndIf iPosX = 0 If iFind > -1 ; Erweiterungspfeile setzen If *PB\iLeftGadget = -1 ; neue Gadgets anlegen OpenGadgetList(iID) *PB\iLeftGadget = PathBarArrow(iID,#True,*PB\iTyp,#PB_Any,#PathBar_LeftArrow,iPosX,0,iBrPfL,GadgetHeight(iID)) *PB\iRightGadget = PathBarArrow(iID,#True,*PB\iTyp,#PB_Any,#PathBar_RightArrow,GadgetWidth(iID)-iBrPfR,0,iBrPfR,GadgetHeight(iID)) CloseGadgetList() Else ; rechten Erweiterungspfeil verschieben ResizeGadget(*PB\iRightGadget,GadgetWidth(iID)-iBrPfR,#PB_Ignore,#PB_Ignore,#PB_Ignore) EndIf iImage = GetGadgetData(*PB\iLeftGadget) If iAnf = 0 ; Darstellung vom Anfang -> linken Erweiterunspfeil ausgrauen If (*PB\iTyp & #PathBar_Style) <> #PathBar_Image DisableGadget(*PB\iLeftGadget,1) Else PathBarDrawPfeilButton(iID,4|256,iImage,ImageWidth(iImage),ImageHeight(iImage)) SetGadgetState(*PB\iLeftGadget,ImageID(iImage)) EndIf Else ;; Darstellung nicht vom Anfang -> linken Erweiterunspfeil aktiv setzen If (*PB\iTyp & #PathBar_Style) <> #PathBar_Image DisableGadget(*PB\iLeftGadget,0) Else PathBarDrawPfeilButton(iID,4,iImage,ImageWidth(iImage),ImageHeight(iImage)) SetGadgetState(*PB\iLeftGadget,ImageID(iImage)) EndIf EndIf iPosX + GadgetWidth(*PB\iLeftGadget)+1 iImage = GetGadgetData(*PB\iRightGadget) If iEnd = *PB\iAnz-1 ; dasselbe rechts am Ende If (*PB\iTyp & #PathBar_Style) <> #PathBar_Image DisableGadget(*PB\iRightGadget,1) Else PathBarDrawPfeilButton(iID,3|256,iImage,ImageWidth(iImage),ImageHeight(iImage)) SetGadgetState(*PB\iRightGadget,ImageID(iImage)) EndIf Else If (*PB\iTyp & #PathBar_Style) <> #PathBar_Image DisableGadget(*PB\iRightGadget,0) Else PathBarDrawPfeilButton(iID,3,iImage,ImageWidth(iImage),ImageHeight(iImage)) SetGadgetState(*PB\iRightGadget,ImageID(iImage)) EndIf EndIf Else ; Erweiterungspfeile freigeben If IsGadget(*PB\iLeftGadget) iImage = GetGadgetData(*PB\iLeftGadget) FreeGadget(*PB\iLeftGadget) If IsImage(iImage) FreeImage(iImage) EndIf *PB\iLeftGadget = -1 EndIf If IsGadget(*PB\iRightGadget) iImage = GetGadgetData(*PB\iRightGadget) FreeGadget(*PB\iRightGadget) If IsImage(iImage) FreeImage(iImage) EndIf *PB\iRightGadget = -1 EndIf EndIf Protected iAnzG.i = 0, iAbst.i = 0, iFrei.i = GadgetWidth(*PB\iID) For i = iAnf To iEnd Step 1 iGdIm = GetGadgetData(*PB\aiGadget[i]) iFrei - (PathBarTextSize(*PB\iTyp,i,iGdIm,*PB\iFont,*PB\asGadgetText[i])+2*PathBarBorderWidth()+4) - 1 If i % 2 = 1 iAnzG + 1 EndIf Next i If iAnf = 0 And iEnd = *PB\iAnz-1 iFrei = 0 Else iFrei - (GadgetWidth(*PB\iLeftGadget)+1+GadgetWidth(*PB\iRightGadget)) EndIf For i = 0 To *PB\iAnz-1 Step 1 If i < iAnf Or i > iEnd HideGadget(*PB\aiGadget[i],1) Else iGdIm = GetGadgetData(*PB\aiGadget[i]) iBreite = PathBarTextSize(*PB\iTyp,i,iGdIm,*PB\iFont,*PB\asGadgetText[i])+2*PathBarBorderWidth()+4 If i%2 = 0 PathBarArrow(*PB\iID,#False,*PB\iTyp,*PB\aiGadget[i],#PathBar_PathArrow,iPosX,0,iBreite,GadgetHeight(*PB\iID)) Else iBreite + (iFrei/iAnzG) PathBarButton(*PB\iID,#False,*PB\iTyp,*PB\aiGadget[i],*PB\iFont,iPosX,0,iBreite,GadgetHeight(*PB\iID),*PB\asGadgetText[i]) iFrei - (iFrei/iAnzG) iAnzG - 1 EndIf HideGadget(*PB\aiGadget[i],0) iPosX + iBreite+1 If i = *PB\iAnz-1 ; letzten Pfeil ausgrauen, wenn kein Directory oder File vorhanden ist Protected sPath.s = PathBarGetPath(*PB\iID,-1) If (*PB\iTyp & #PathBar_FileDir) = #PathBar_Dir iAnz = PathBarGetFileDirAnz(2,sPath) Else iAnz = PathBarGetFileDirAnz(6,sPath) EndIf iImage = GetGadgetData(*PB\aiGadget[i]) If iAnz = 0 If (*PB\iTyp & #PathBar_Style) = #PathBar_Image PathBarDrawPfeilButton(iID,1|256,iImage,ImageWidth(iImage),ImageHeight(iImage)) SetGadgetState(*PB\aiGadget[i],ImageID(iImage)) EndIf DisableGadget(*PB\aiGadget[i],1) Else If (*PB\iTyp & #PathBar_Style) = #PathBar_Image PathBarDrawPfeilButton(iID,1,iImage,ImageWidth(iImage),ImageHeight(iImage)) SetGadgetState(*PB\aiGadget[i],ImageID(iImage)) EndIf DisableGadget(*PB\aiGadget[i],0) EndIf EndIf EndIf Next i *PB\iVon = iAnf *PB\iBis = iEnd EndIf ProcedureReturn iFind EndProcedure Procedure AddPathBarButton(iID.i,sText.s) ; ************************************************* ; Hinzufügen eines Buttons in die PathBar ; ************************************************* Protected iSize.i = GadgetWidth(iID), iBreite.i, i.i Protected *PB.PathBars = PathBarMem(0) Protected iAnz.i = PathBarAnz() For i=0 To iAnz-1 Step 1 If *PB\iID = iID If OpenGadgetList(*PB\iID) Protected iX.i = GadgetX(*PB\aiGadget[*PB\iAnz-1]) + GadgetWidth(*PB\aiGadget[*PB\iAnz-1]) + 1 Protected iGdIm.i iGdIm = GetGadgetData(*PB\aiGadget[*PB\iAnz-1]) iBreite = PathBarTextSize(*PB\iTyp,1,iGdIm,*PB\iFont,sText)+2*PathBarBorderWidth()+4 Protected iPBButton.i = PathBarButton(*PB\iID,#True,*PB\iTyp,#PB_Any,*PB\iFont,iX,0,iBreite,*PB\iHeight,sText) ; Normaler Button, kein Default iX + GadgetWidth(iPBButton) + 1 ; neue X-Position zum Beginnen eines neuen Pathbar-Objektes *PB\aiGadget[*PB\iAnz] = iPBButton *PB\asGadgetText[*PB\iAnz] = sText *PB\asText[*PB\iAnz] = sText *PB\iAnz + 1 Protected iHeight.i = GadgetHeight(iID) Protected iWidth.i = (iHeight/5)*4-4-2*PathBarBorderWidth() Protected iPBSep.i = PathBarArrow(*PB\iID,#True,*PB\iTyp,#PB_Any,#PathBar_PathArrow,iX,0,iWidth,*PB\iHeight) ; Seperator iX + GadgetWidth(iPBSep) + 1 *PB\aiGadget[*PB\iAnz] = iPBSep *PB\asText[*PB\iAnz] = ">" *PB\iAnz + 1 CloseGadgetList() SizePathBar(iID,-1,*PB\iAnz-1) ProcedureReturn iPBButton EndIf EndIf *PB + SizeOf(PathBars) Next i EndProcedure Procedure ResizePathBar(iID.i,iX.i,iY.i,iWidth.i,iHeight.i) ; ************************************************* ; Gadget Resize ; ************************************************* Protected *PB.PathBars = PathBarMem(0) Protected iAnz.i = PathBarAnz(), i.i For i=0 To iAnz-1 Step 1 If *PB\iID = iID ResizeGadget(iID,iX,iY,iWidth,iHeight) SizePathBar(iID,*PB\iVon,*PB\iBis) Break EndIf *PB + SizeOf(PathBars) Next i EndProcedure Procedure SetPathBarFont(iID.i,iFont.i) ; ************************************************* ; Setzen des Fonts der angegebenen PathBar ; ************************************************* Protected *PB.PathBars = PathBarMem(0) Protected iAnz.i = PathBarAnz(), i.i For i=0 To iAnz-1 Step 1 If *PB\iID = iID *PB\iFont = iFont ; Font Liste setzen If *PB\iAnz>0 SizePathBar(iID,*PB\iVon,*PB\iBis) EndIf Break EndIf *PB + SizeOf(PathBars) Next i EndProcedure Procedure.s PathBarGetPath(iID.i,iBis.i) ; ************************************************* ; Ermittlung des aktuellen Pfades in der PathBar ; ************************************************* Protected sPath.s = "" Protected *PB.PathBars = PathBarMem(0) Protected iAnz.i = PathBarAnz(), i.i For i=0 To iAnz-1 Step 1 If *PB\iID = iID If iBis = -1 iBis = *PB\iAnz-1 EndIf For i = 1 To iBis Step 2 sPath + *PB\asText[i] + "\" Next i Break EndIf *PB + SizeOf(PathBars) Next i ProcedureReturn sPath EndProcedure Procedure PathBarStyle(iID.i,iStyle.i) ; ************************************************* ; Setzen von Styles für die PathBar ; ************************************************* Protected *PB.PathBars = PathBarMem(0) Protected iAnz.i = PathBarAnz(), i.i, iChange.i = 0 For i=0 To iAnz-1 Step 1 If *PB\iID = iID If iStyle & #PathBar_Style Protected sPath.s = PathBarGetPath(iID,-1) *PB\iTyp = (*PB\iTyp & (~#PathBar_Style)) | (iStyle & #PathBar_Style) If *PB\iAnz ClearPathBar(iID,0) PathBarSetPath(iID,sPath) EndIf EndIf If iStyle & #PathBar_FileDir *PB\iTyp = (*PB\iTyp & (~#PathBar_FileDir)) | (iStyle & #PathBar_FileDir) EndIf If iStyle & #PathBar_MenuForm *PB\iTyp = (*PB\iTyp & (~#PathBar_MenuForm)) | (iStyle & #PathBar_MenuForm) EndIf If iStyle & #PathBar_NameIcon *PB\iTyp = (*PB\iTyp & (~#PathBar_NameIcon)) | (iStyle & #PathBar_NameIcon) EndIf Break EndIf *PB + SizeOf(PathBars) Next i EndProcedure Procedure PathBarSetPath(iID.i,sPath.s) ; ************************************************* ; Vorgeben eines Pfades für die PathBar ; ************************************************* Protected iAnz=CountString(sPath,"\")+1,i Protected sTeil.s ClearPathBar(iID,0) For i = 1 To iAnz sTeil = StringField(sPath,i,"\") If sTeil = "" Continue EndIf If i = 1 AddPathBarRoot(iID,sTeil) Else AddPathBarButton(iID,sTeil) EndIf Next i EndProcedure Procedure PathBarSizeList(iGadget.i) Protected iW.i=0,iH.i=0,i.i,iGH.i = GadgetHeight(iGadget),iGW.i = GadgetWidth(iGadget), iSx.i = 0, iSy.i = 0 Protected iAnz.i=CountGadgetItems(iGadget),iWin.i = GetGadgetData(iGadget), iGID.i = GadgetID(iGadget) Protected DC = GetDC_(iGID) Protected sText.s Protected O.SIZE Protected R.RECT SelectObject_(DC,GetGadgetFont(iGadget)) For i=0 To iAnz-1 Step 1 R\left = #LVIR_ICON SendMessage_(iGID,#LVM_GETITEMRECT,i,@R) If iW < R\right iW = R\right EndIf If iH < R\bottom - R\top iH = R\bottom - R\top EndIf sText = GetGadgetItemText(iGadget,i) GetTextExtentPoint32_(DC,sText,Len(sText),@O) If iW < O\cx + R\right iW = O\cx + 2*R\right EndIf If iH < O\cy iH = O\cy EndIf Next i ReleaseDC_(GadgetID(iGadget),DC) i = SendMessage_(GadgetID(iGadget),#LVM_GETITEMSPACING,#True,0) i >> 16 iW + 6; + PathBarBorderWidth()*4 iH = (i+1)*iAnz + 4 ; + PathBarBorderWidth()*2 If iW > iGW iSy = GetSystemMetrics_(#SM_CYHSCROLL);+PathBarBorderWidth()*2 EndIf If iH < iGH ResizeWindow(iWin,#PB_Ignore,#PB_Ignore,#PB_Ignore,iH+iSy) ResizeGadget(iGadget,#PB_Ignore,#PB_Ignore,#PB_Ignore,iH+iSy); -PathBarBorderWidth()*2-2) ElseIf iH > iGH iSx = GetSystemMetrics_(#SM_CXVSCROLL); +PathBarBorderWidth()*2 EndIf If iW + iSx <= iGW ResizeWindow(iWin,#PB_Ignore,#PB_Ignore,iW+iSx,#PB_Ignore) ResizeGadget(iGadget,#PB_Ignore,#PB_Ignore,iW+iSx,#PB_Ignore); -PathBarBorderWidth()*2-2,#PB_Ignore) EndIf SetGadgetItemAttribute(iGadget,-1,#PB_ListIcon_ColumnWidth,iW-4,0); -4-PathBarBorderWidth()*4,0) EndProcedure Procedure PathBarCloseAuswahl() Protected iAnz.i = PathBarAnz(), i.i, j.i Protected *PB.PathBars = PathBarMem(0) For i=0 To iAnz-1 Step 1 If IsWindow(*PB\iWinEG) FreeGadget(*PB\iMenu) CloseWindow(*PB\iWinEG) *PB\iMenu = -1 *PB\iWinEG = -1 PathBarIconBuffer(-2) For j = *PB\iVon To *PB\iBis Step 1 If j%2 = 0 PathBarArrow(*PB\iID,#False,*PB\iTyp,*PB\aiGadget[j],#PathBar_PathArrow,GadgetX(*PB\aiGadget[j]),0,GadgetWidth(*PB\aiGadget[j]),GadgetHeight(*PB\iID)) EndIf Next j ElseIf IsMenu(*PB\iMenu) FreeMenu(*PB\iMenu) *PB\iMenu = -1 PathBarIconBuffer(-2) For j = *PB\iVon To *PB\iBis Step 1 If j%2 = 0 PathBarArrow(*PB\iID,#False,*PB\iTyp,*PB\aiGadget[j],#PathBar_PathArrow,GadgetX(*PB\aiGadget[j]),0,GadgetWidth(*PB\aiGadget[j]),GadgetHeight(*PB\iID)) EndIf Next j EndIf *PB + SizeOf(PathBars) Next i EndProcedure Procedure IsDir(sPath.s) Protected iDir.i = ExamineDirectory(#PB_Any,sPath,"*.*") If iDir FinishDirectory(iDir) ProcedureReturn #True EndIf ProcedureReturn #False EndProcedure Procedure.s PathBarSet(*PB.PathBars,sPath.s) Protected iImage.i Protected sPath1.s, sPath2.s If *PB\iAkt = 0 ClearPathBar(*PB\iID,3) *PB\asGadgetText[1] = sPath *PB\asText[1] = sPath SizePathBar(*PB\iID,0,2) ElseIf *PB\iAkt = *PB\iAnz-1 sPath1.s = PathBarGetPath(*PB\iID,-1) + sPath sPath2.s = GetDirectoryTarget(sPath1) If sPath1 = sPath2 If IsDir(sPath1) AddPathBarButton(*PB\iID,sPath) sPath = PathBarGetPath(*PB\iID,-1) Else sPath = sPath1 EndIf Else If IsDir(sPath2) PathBarSetPath(*PB\iID,sPath2) sPath = sPath2 Else sPath = sPath2 PathBarSetPath(*PB\iID,GetPathPart(sPath2)) EndIf EndIf Else ClearPathBar(*PB\iID,*PB\iAkt+1) sPath1 = PathBarGetPath(*PB\iID,-1) If IsDir(sPath1+sPath) AddPathBarButton(*PB\iID,sPath) EndIf sPath = sPath1 + sPath EndIf If *PB\iTyp & #PathBar_Image iImage = GetGadgetData(*PB\aiGadget[*PB\iAkt]) PathBarDrawPfeilButton(*PB\iID,1,iImage,ImageWidth(iImage),ImageHeight(iImage)) SetGadgetState(*PB\aiGadget[*PB\iAkt],ImageID(iImage)) EndIf *PB\iMenu = -1 *PB\iAkt = -1 If Right(sPath,1) <> "\" And IsDir(sPath) sPath + "\" EndIf ProcedureReturn sPath EndProcedure Procedure PathBarFillList(*PB.PathBars) Protected Dim asDir.s(100) Protected Pkt.point Protected i.i, iAnz.i = 0 Protected sPath.s DrawTime(*PB,0,GetGadgetData(*PB\aiGadget[*PB\iAkt])) If *PB\iAkt = 0 iAnz = PathBarGetFileDir(1,"",asDir(),*PB) Else sPath = PathBarGetPath(*PB\iID,*PB\iAkt) If (*PB\iTyp & #PathBar_FileDir) = #PathBar_Dir iAnz = PathBarGetFileDir(2,sPath,asDir(),*PB) Else iAnz = PathBarGetFileDir(6,sPath,asDir(),*PB) EndIf EndIf If iAnz Pkt\x = GadgetX(*PB\aiGadget[*PB\iAkt])+GadgetX(*PB\iID) Pkt\y = GadgetY(*PB\aiGadget[*PB\iAkt])+GadgetY(*PB\iID)+GadgetHeight(*PB\aiGadget[*PB\iAkt]) ClientToScreen_(WindowID(*PB\iWin),@Pkt) If *PB\iTyp & #PathBar_ListView If *PB\iAkt = 0 *PB\iWinEG = OpenWindow(#PB_Any,Pkt\x,Pkt\y,PathBarListSize(#PathBar_DriveListWidth),PathBarListSize(#PathBar_DriveListHeight),"",#PB_Window_BorderLess,WindowID(*PB\iWin)) *PB\iMenu = ListIconGadget(#PB_Any,0,0,PathBarListSize(#PathBar_DriveListWidth),PathBarListSize(#PathBar_DriveListHeight),"",PathBarListSize(#PathBar_DriveListWidth),#LVS_NOCOLUMNHEADER) Else *PB\iWinEG = OpenWindow(#PB_Any,Pkt\x,Pkt\y,PathBarListSize(#PathBar_DirListWidth),PathBarListSize(#PathBar_DirListHeight),"",#PB_Window_BorderLess,WindowID(*PB\iWin)) *PB\iMenu = ListIconGadget(#PB_Any,0,0,PathBarListSize(#PathBar_DirListWidth),PathBarListSize(#PathBar_DirListHeight),"",PathBarListSize(#PathBar_DirListWidth),#LVS_NOCOLUMNHEADER) EndIf SetGadgetFont(*PB\iMenu,FontID(PathBarTextFont())) For i = 0 To iAnz-1 Step 1 If *PB\iTyp & #PathBar_Icons AddGadgetItem(*PB\iMenu,-1,asDir(i),PathBarIconBuffer(i)) Else AddGadgetItem(*PB\iMenu,-1,asDir(i)) EndIf Next i SetGadgetData(*PB\iMenu,*PB\iWinEG) PathBarSizeList(*PB\iMenu) SetActiveWindow(*PB\iWinEG) SetActiveGadget(*PB\iMenu) ElseIf *PB\iTyp & #PathBar_ImageMenu *PB\iMenu = CreatePopupImageMenu(#PB_Any,#PB_Menu_ModernLook) For i=0 To iAnz-1 MenuItem(PathBarMenuNr(#PathBar_MenuMin)+i,asDir(i),PathBarIconBuffer(i)) If PathBarMenuNr(#PathBar_MenuMin)+i = PathBarMenuNr(#PathBar_MenuMax) Break EndIf Next i DisplayPopupMenu(*PB\iMenu,WindowID(*PB\iWin),Pkt\x,Pkt\y) Else *PB\iMenu = CreatePopupMenu(#PB_Any) For i=0 To iAnz-1 MenuItem(PathBarMenuNr(#PathBar_MenuMin)+i,asDir(i),PathBarIconBuffer(i)) If PathBarMenuNr(#PathBar_MenuMin)+i = PathBarMenuNr(#PathBar_MenuMax) Break EndIf Next i DisplayPopupMenu(*PB\iMenu,WindowID(*PB\iWin),Pkt\x,Pkt\y) EndIf EndIf DrawTime(*PB,-2,GetGadgetData(*PB\aiGadget[*PB\iAkt])) EndProcedure Procedure PathBarRedraw (*PB.PathBars) SizePathBar(*PB\iID,*PB\iVon,*PB\iBis) EndProcedure Procedure.s ProcessPathBarEvent(iEvent.i,*iPB) ; ************************************************* ; Verarbeiten der PathBar-Events ; ************************************************* Protected sPath.s = "", sNew.s Protected iFind.i = -1, i.i, j.i, k.i, iGdIm.i, iWin.i = EventWindow() Protected *PB1.PathBars = PathBarMem(0), *PB.PathBars Protected iAnz.i = PathBarAnz() Protected Pkt.point PokeI(*iPB,-1) *PB = *PB1 For j=0 To iAnz-1 Step 1 If IsWindow(*PB\iWinEG) If GetActiveWindow() <> *PB\iWinEG PathBarCloseAuswahl() ProcedureReturn "" EndIf EndIf *PB + SizeOf(PathBars) Next j If iEvent = #PB_Event_MoveWindow *PB = *PB1 For j=0 To iAnz-1 Step 1 If *PB\iWin = iWin And IsWindow(*PB\iWinEG) Pkt\x = GadgetX(*PB\aiGadget[*PB\iAkt])+GadgetX(*PB\iID) Pkt\y = GadgetY(*PB\aiGadget[*PB\iAkt])+GadgetY(*PB\iID)+GadgetHeight(*PB\aiGadget[*PB\iAkt]) ClientToScreen_(WindowID(*PB\iWin),@Pkt) ResizeWindow(*PB\iWinEG,Pkt\x,Pkt\y,WindowWidth(*PB\iWinEG),WindowHeight(*PB\iWinEG)) EndIf *PB + SizeOf(PathBars) Next j ElseIf iEvent = #PB_Event_Gadget Protected iGadget.i = EventGadget() Protected iType.i = EventType() *PB = *PB1 For j=0 To iAnz-1 Step 1 If IsMenu(*PB\iMenu) PathBarCloseAuswahl() ProcedureReturn "" EndIf If *PB\iWinEG = iWin And iGadget = *PB\iMenu Break EndIf If *PB\iWin = iWin If iGadget = *PB\iLeftGadget Or iGadget = *PB\iRightGadget Break EndIf For k=0 To *PB\iAnz-1 Step 1 If iGadget = *PB\aiGadget[k] Break EndIf Next k If k < *PB\iAnz Break EndIf EndIf *PB + SizeOf(PathBars) Next j If j = iAnz ProcedureReturn "" EndIf If iType = #PB_EventType_LostFocus *PB = *PB1 For j=0 To iAnz-1 Step 1 If (*PB\iWinEG = iWin And iGadget = *PB\iMenu) Or IsMenu(*PB\iMenu) PathBarCloseAuswahl() EndIf *PB + SizeOf(PathBars) Next j EndIf *PB = *PB1 For j=0 To iAnz-1 Step 1 If iGadget = *PB\iLeftGadget Or iGadget = *PB\iRightGadget PathBarCloseAuswahl() PokeI(*iPB,*PB\iID) If iGadget = *PB\iLeftGadget And *PB\iVon > 0 If *PB\iVon > 3 SizePathBar(*PB\iID,*PB\iVon-2,-1) Else SizePathBar(*PB\iID,0,-1) EndIf ElseIf iGadget = *PB\iRightGadget And *PB\iBis < *PB\iAnz-2 SizePathBar(*PB\iID,-1,*PB\iBis+2) EndIf ProcedureReturn "" ElseIf iGadget = *PB\iMenu And IsWindow(*PB\iWinEG) i = GetGadgetState(*PB\iMenu) If i > -1 sPath = GetGadgetItemText(*PB\iMenu,i) FreeGadget(*PB\iMenu) CloseWindow(*PB\iWinEG) *PB\iMenu = -1 *PB\iWinEG = -1 sPath = PathBarSet(*PB,sPath) SizePathBar(*PB\iID,-1,*PB\iAnz-1) PokeI(*iPB,*PB\iID) ProcedureReturn sPath EndIf EndIf For i=0 To *PB\iAnz-1 Step 1 If iGadget = *PB\aiGadget[i] iFind = *PB\iID PokeI(*iPB,*PB\iID) Break EndIf Next i If iFind > -1 PathBarCloseAuswahl() sPath = "" If i%2 = 1 If *PB\iMenu = -1 ClearPathBar(iFind,i+2) sPath = PathBarGetPath(iFind,-1) SizePathBar(iFind,-1,*PB\iAnz-1) Else If IsWindow(*PB\iWinEG) FreeGadget(*PB\iMenu) CloseWindow(*PB\iWinEG) EndIf *PB\iMenu = -1 *PB\iWinEG = -1 If *PB\iTyp & #PathBar_Image iGdIm = GetGadgetData(*PB\aiGadget[*PB\iAkt]) PathBarDrawPfeilButton(*PB\iID,1,iGdIm,ImageWidth(iGdIm),ImageHeight(iGdIm)) SetGadgetState(*PB\aiGadget[*PB\iAkt],ImageID(iGdIm)) Else SetGadgetText(*PB\aiGadget[*PB\iAkt],PathBarSpecialChar(#PathBarSonder_P)) EndIf *PB\iAkt = -1 EndIf Else If *PB\iMenu = -1 If iType = #PB_EventType_LeftClick *PB\iAkt = i If *PB\iTyp & #PathBar_Image iGdIm = GetGadgetData(*PB\aiGadget[*PB\iAkt]) PathBarDrawPfeilButton(*PB\iID,5,iGdIm,ImageWidth(iGdIm),ImageHeight(iGdIm)) SetGadgetState(*PB\aiGadget[*PB\iAkt],ImageID(iGdIm)) Else SetGadgetText(*PB\aiGadget[*PB\iAkt],PathBarSpecialChar(#PathBarSonder_U)) EndIf PathBarFillList(*PB) EndIf Else If *PB\iTyp & #PathBar_ListView FreeGadget(*PB\iMenu) CloseWindow(*PB\iWinEG) Else FreeMenu(*PB\iMenu) EndIf *PB\iWinEG = -1 *PB\iMenu = -1 If *PB\iTyp & #PathBar_Image iGdIm = GetGadgetData(*PB\aiGadget[*PB\iAkt]) PathBarDrawPfeilButton(*PB\iID,1,iGdIm,ImageWidth(iGdIm),ImageHeight(iGdIm)) SetGadgetState(*PB\aiGadget[*PB\iAkt],ImageID(iGdIm)) Else SetGadgetText(*PB\aiGadget[*PB\iAkt],PathBarSpecialChar(#PathBarSonder_P)) EndIf *PB\iAkt = -1 EndIf EndIf ProcedureReturn sPath EndIf *PB + SizeOf(PathBars) Next j ElseIf iEvent = #PB_Event_Menu Protected iMenu = EventMenu() iFind = -1 *PB = *PB1 For i = 0 To iAnz-1 Step 1 If *PB\iMenu <> -1 iFind = 1 Break EndIf *PB + SizeOf(PathBars) Next i If iFind > -1 sPath = GetMenuItemText(*PB\iMenu,iMenu) PathBarIconBuffer(-2) FreeMenu(*PB\iMenu) sPath = PathBarSet(*PB,sPath) SizePathBar(*PB\iID,-1,*PB\iAnz-1) PokeI(*iPB,*PB\iID) Else PathBarCloseAuswahl() EndIf ElseIf iEvent = #PB_Event_SysTray Or iEvent = #PB_Event_MoveWindow ElseIf iEvent = #PB_Event_SizeWindow *PB = *PB1 For j=0 To iAnz-1 Step 1 If EventWindow() = *PB\iWinEG PokeI(*iPB,*PB\iID) EndIf *PB + SizeOf(PathBars) Next j ;PathBarCloseAuswahl() ElseIf iEvent = #PB_Event_MinimizeWindow Or iEvent = #PB_Event_MaximizeWindow Or iEvent = #PB_Event_RestoreWindow Or iEvent = #PB_Event_ActivateWindow Or iEvent = #PB_Event_WindowDrop Or iEvent = #PB_Event_GadgetDrop EndIf ProcedureReturn sPath EndProcedure ; ****************************************************************************************************** ; BEISPIEL ZUR VERWENDUNG DER PATHBAR ; ****************************************************************************************************** Enumeration #PB1 #PB2 #PB3 EndEnumeration #Window0 = 0 Procedure Main() Protected iFont3 = LoadFont(#PB_Any,"Times New Roman",8) If OpenWindow(#Window0, 0, 0, 230, 90, "PathBar Event-Handling Beispiel...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget) Protected sPath.s = GetPathPart(ProgramFilename()) PathBarInit() PathBarTextHeight(8) PathBarTextFont() If AddPathBar(#Window0,#PB1,4,5,200,20) <> -1 PathBarStyle(#PB1,#PathBar_ListView) SetPathBarFont(#PB1,iFont3) AddPathBarRoot(#PB1,"C:") EndIf If AddPathBar(#Window0,#PB2,4,30,200,20) <> -1 PathBarStyle(#PB2,#PathBar_FlatButton) PathBarSetPath(#PB2,sPath) EndIf If AddPathBar(#Window0,#PB3,4,55,200,20) <> -1 PathBarColor(#PB3,#PathBar_FillColor,RGB(220,190,190)) PathBarColor(#PB3,#PathBar_ArrowColor,RGB(110,110,250)) PathBarStyle(#PB3,#PathBar_Image|#PathBar_FileDir|#PathBar_ImageMenu) PathBarSetPath(#PB3,sPath) EndIf Protected iPathBar.i, Event Repeat Event = WaitWindowEvent() sPath.s = ProcessPathBarEvent(Event,@iPathBar) If sPath <> "" If iPathBar = #PB1 Debug "PathBar1 : " + sPath ElseIf iPathBar = #PB2 Debug "PathBar2 : " + sPath ElseIf iPathBar = #PB3 Debug "PathBar3 : " + sPath EndIf Continue EndIf If iPathBar > -1 Continue EndIf Select Event Case #PB_Event_Gadget Select EventGadget() EndSelect Case #PB_Event_SizeWindow ResizePathBar(#PB1,#PB_Ignore,#PB_Ignore,WindowWidth(#Window0)-30,#PB_Ignore) ResizePathBar(#PB2,#PB_Ignore,#PB_Ignore,WindowWidth(#Window0)-30,#PB_Ignore) ResizePathBar(#PB3,#PB_Ignore,#PB_Ignore,WindowWidth(#Window0)-30,#PB_Ignore) EndSelect Until Event = #PB_Event_CloseWindow EndIf PathBarFree() EndProcedure Main() ; IDE Options = PureBasic 5.20 beta 17 LTS (Windows - x86) ; CursorPosition = 2110 ; FirstLine = 2095 ; Folding = ----------- ; EnableXP