(* ShowNeighbours 0.9

Skripti näyttää valitun kansion naapurikansiot.

Harjoitelma AppleScriptin ja Finderin omituisuuksien seulomisessa.
Tuottaa käyttäjälle ymmärrettävät tulokset riippumatta mm.
valitun kansion läheisyydestä Työpöytään, joka sekoittaa herkästi
hakemistopolkujen selvittelyn olemalla eri levyjen kesken yhteinen.
Työpöytäkansion sijainti on skriptissä häivytetty kuten Finderissakin.

Vaatimukset Mac OS Classic, AppleScript, standard additions.

2001 Tuomas Rosberg <vanhentunut>
Lähdekoodi on ilmaista ja tarkoitettu yleiseen käyttöön (public domain).
Sitä lainattessa kirjoittajan nimi on mainittava.
Koodilla ei ole mitään takuuta, ja sen sisältävää ohjelmaa käyttävät
toimivat omalla vastuullaan.

*)

global otherFolders, originalFolder

on run
   choose folder with prompt "Valitse kansio, jonka naapurikansiot haetaan."
   set originalFolder to result
   if (originalFolder as string) does not contain "FindByContent" then -- I hope this is invisible after AppleScript v. 1.3.4.
      set otherFolders to {}
      tell application "Finder"
         try
            set parentFolder to container of originalFolder
         on error -- The original folder has no container, so it must be the Desktop Folder.
         end try
      end tell
      try
         set parentFolder to parentFolder as alias
         my listNeighbours(parentFolder)
      on error -- Container didn't coerse to an alias, so it must be desktop.
         my listDesktop()
      end try
      my showResult()
   else
      display dialog ¬
         "Näkemiin." buttons "Kiitos" default button 1
   end if
end run

on listNeighbours(parentFolder)
   list folder parentFolder without invisibles
   set namesList to result
   repeat with x in namesList
      set pathText to (parentFolder as string) & contents of x
      set anAlias to pathText as alias
      if last character of (anAlias as string) is ":" then
         tell application "Finder" to copy name of anAlias to aName
         if (anAlias as string) does not contain "Desktop" then --'list folder' regards desktop folder visible, so it is picked by hand.
            if anAlias is not originalFolder then
               set anEntry to {{name:aName, path:anAlias}}
               set otherFolders to otherFolders & anEntry
            end if
         end if
      end if
   end repeat
end listNeighbours

on listDesktop()
   tell application "Finder"
      set theList to every container in desktop
      repeat with aContainer in theList
         set aName to name of aContainer
         try
            set aContainer to aContainer as alias
            if aContainer is not originalFolder then
               set anEntry to {{name:aName, path:aContainer}}
               set otherFolders to otherFolders & anEntry
            end if
         on error -- It is the trash can. Leave it.
         end try
      end repeat
   end tell
end listDesktop

on showResult()
   set namesList to {}
   repeat with f in otherFolders
      set namesList to namesList & name in f
   end repeat
   choose from list namesList
   set chosenName to result
   if chosenName is not false then -- 'choose from list' returns false if cancelled.
      repeat with f in otherFolders
         if name in f contains chosenName then
            exit repeat
         end if
      end repeat
      set chosenFolder to path in f
      tell application "Finder"
         activate
         open chosenFolder
      end tell
   end if
end showResult