Seite 1 von 5

Auto OpenMyIncludes in PB-IDE

Verfasst: 08.04.2007 20:30
von ts-soft
Aufgrund eines Beitrags von AND51 hier:
http://www.purebasic.fr/english/viewtopic.php?t=26293

Hab ich dies mal auf die schnelle umgesetzt, weil warten ist schön, selber
proggen hilft aber schneller :mrgreen:

Dieses Programm öffnet automatisch beim laden eines Sources in die IDE,
die zugehörigen Include-Files, falls noch nicht geschehen! Hierzu sollte
aber nur eine Instanz der Ide zugelassen werden (siehe Optionen)

Geschwindigkeitswunder gibts hierbei keine, bzw. die IDE steigt auch schon
mal aus.
Code:

Code: Alles auswählen

; OpenIncludes
; Autor: Thomas (ts-soft) Schulz
; PB4 erforderlich

EnableExplicit

Global Mutex.l

Procedure FindStringLeft(String.s, StringToFind.s, Startposition.l = 0)

  Protected len, len2, index

  len = Len(String)
  len2 = Len(StringToFind)
  If Startposition = 0
    Startposition = len
  EndIf
  For index = Startposition To 1 Step - 1
    If Mid(String, index, len2) = StringToFind
      ProcedureReturn index
    EndIf
  Next
  ProcedureReturn 0

EndProcedure

Procedure OnlyOne()
  Mutex = CreateMutex_(0, 0, @"{112E4DF0-2388-41B2-87F4-CE683443180E}")
  If GetLastError_() = #ERROR_ALREADY_EXISTS
    ReleaseMutex_(Mutex)
    CloseHandle_(Mutex)
    ProcedureReturn #False
  EndIf
  ProcedureReturn #True
EndProcedure

Define.s Line, Path, Path2, IFile, PBDir, File = ProgramParameter()
Define.l FF, Pos, PosB, PosE, Ft = #PB_Ascii

While Not OnlyOne()
  Delay(10)
Wend

PBDir = GetPathPart(GetEnvironmentVariable("PB_TOOL_IDE"))

If File <> ""
  Path = GetPathPart(File)

  FF = ReadFile(#PB_Any, File)
  If FF
    If ReadStringFormat(FF) <> #PB_Ascii : Ft = #PB_UTF8 : EndIf
    
    FileBuffersSize(FF, Lof(FF))
    
    While Not Eof(FF)
      IFile = ""
      Path2 = ""

      Line = ReadString(FF, Ft)

      Pos = FindString(Line, "IncludePath", 1)
      If FindStringLeft(Line, ";", Pos) Or FindStringLeft(Line, #DQUOTE$, Pos)
        Pos = 0
      EndIf
      If Pos
        PosB = FindString(Line, #DQUOTE$, Pos + 12) + 1
        PosE = FindString(Line, #DQUOTE$, PosB)
        If PosB And PosE
          Path = Mid(Line, PosB, PosE - PosB)
        EndIf
      EndIf

      Pos = FindString(Line, "IncludeFile", 1)
      If FindStringLeft(Line, ";", Pos) Or FindStringLeft(Line, #DQUOTE$, Pos)
        Pos = 0
      EndIf
      If Pos
        PosB = FindString(Line, #DQUOTE$, Pos + 12) + 1
        PosE = FindString(Line, #DQUOTE$, PosB)
        If PosB And PosE
          IFile = Mid(Line, PosB, PosE - PosB)
        EndIf
      EndIf

      Pos = FindString(Line, "XIncludeFile", 1)
      If FindStringLeft(Line, ";", Pos) Or FindStringLeft(Line, #DQUOTE$, Pos)
        Pos = 0
      EndIf
      If Pos
        PosB = FindString(Line, #DQUOTE$, Pos + 13) + 1
        PosE = FindString(Line, #DQUOTE$, PosB)
        If PosB And PosE
          IFile = Mid(Line, PosB, PosE - PosB)
        EndIf
      EndIf

      If FindString(Line, "#PB_Compiler_Home", Pos + 12)
        Path2 = PBDir
      EndIf

      If IFile <> ""
        If Path2 <> "" And FileSize(Path2 + IFile) > 0
          RunProgram(Path2 + IFile, "", "", #PB_Program_Wait)
        Else
          If FileSize(IFile) > 0
            RunProgram(IFile, "", "", #PB_Program_Wait)
          Else
            If FileSize(Path + IFile) > 0
              RunProgram(Path + IFile, "", "", #PB_Program_Wait)
            EndIf
          EndIf
        EndIf
      EndIf
    Wend
    CloseFile(FF)
  EndIf
EndIf
CloseHandle_(Mutex)

Die erstellte Exe bitte wie folgt konfigurieren:
Bild

Verbesserungsvorschläge willkommen

Gruß
Thomas


// Edit
Noch ein paar kleinere Änderungen eingefügt

Verfasst: 08.04.2007 22:16
von AND51
Ich hab das Gefühl, dieser Thread kommt mir sehr gelegen... Wieso nur? :mrgreen:

Vielen Dank, TS-Soft! Selbstgestrickt?

> weil warten ist schön, selber proggen hilft aber schneller
Richtig. Soll das PB Team aber nicht abhalten, das nativ umzusetzen. Jetzt, wo du es ins Rollen bringst: Hätt ich auch selber drauf kommen können, das zu coden... Danke dennoch! :allright: Werde es sofort testen!


> bzw. die IDE steigt auch schon mal aus.
Dahin gehend noch mal nachgebessert, wäre das ja schon perfekt.


//Edit:
Warum eine Prozedur GetPureBasicDir()? Möchtest du damit auch abwä#rtskompatibel zu 3.94 sein? Wenn ja: Dann darfst du nicht 4.0x-Konstanten wie #PB_Ascii verwenden. Statt der Funktion GetPureBasicDir() könntest du vielleicht #PB_Compiler_Home benutzen. Nur so als Vorschlag.

// //Edit:
Das Werkzeug scheint noch nicht 100%ig zu worken. Ich habe eine Hauptdatei, die mehrere Includes enthält, dein Toll hat aber nur das erste Include geöffnet.
Kann dir nicht sagen woran es liegt, aber wenn du den Source brauchst, um das Problem zu beheben, kann ich ihn dir schicken (inkl. Incl.).

// // //Edit:
Gute Idee! Hätte ich das jetzt programmiert, hätte ich glatt vergessen IncludePath zu berücksichtigen! :wink:

// // // //Edit:
Tschuldige, das mit #PB_Compiler_Home nehm ich zur Hälft zurück: Das macht nur Sinn, wenn der Endanwender das Produkt bei sich selber kompiliert und danach das PB Verzeichnis nicht mehr wechselt.

Verfasst: 08.04.2007 22:44
von ts-soft
AND51 hat geschrieben:Ich hab das Gefühl, dieser Thread kommt mir sehr gelegen... Wieso nur? :mrgreen:
Naja, ist Ostern, da dachte ich, das ich auch mal 10 Minuten für Deine Wünsche opfere
AND51 hat geschrieben:
Vielen Dank, TS-Soft! Selbstgestrickt?
Wat sonst, die eine Proc existierte aber schon
AND51 hat geschrieben: //Edit:
Warum eine Prozedur GetPureBasicDir()? Möchtest du damit auch abwä#rtskompatibel zu 3.94 sein? Wenn ja: Dann darfst du nicht 4.0x-Konstanten wie #PB_Ascii verwenden. Statt der Funktion GetPureBasicDir() könntest du vielleicht #PB_Compiler_Home benutzen. Nur so als Vorschlag.
#PB_Compiler_Home ist eine Compilerdirektive, das funzt nicht zur Runtime :mrgreen:
Würde immer den Pfad meiner Installation nutzen, das ist nicht gut.
Bei mir funktioniert es auch mit includes in includes usw., lediglich manchmal
hat die IDE Darstellungsprobleme

Verfasst: 08.04.2007 22:51
von AND51
> das funzt nicht zur Runtime
Ja, das hab ich auch hinterher gemerkt...
Ich kann dir deine GetPureBasicDir() aber durch eine simple Zeile ersetzen, und das ohne Registry. Nützlich für Leute, die PB auf einem USB Stick installierthaben.
WIe das geht, das behalt ich vorerst noch für mich, möchte auch so'nn Tool proggen. Sollte ich aber nicht rechtzeitig fertig sein, verrat ich's dir auch so :mrgreen:

> Würde immer den Pfad meiner Installation nutzen
Mein "Trick" wird das schon richten... :wink:

> Würde immer den Pfad meiner Installation nutzen
Logisch, da das Laden eines Includes wieder das Werkzeug auslöst.

> manchmal hat die IDE Darstellungsprobleme
Warum? Weißt du da was drüber? Ist das der Grund, warum du #PB_Program_Wait verwendest?

Verfasst: 08.04.2007 22:56
von ts-soft
Mach mal ohne #Program_Wait, wirste sehen, das es mehrere Instancen der
IDE gibt, obwohl das laut Einstellung nicht sein darf :mrgreen:

Verfasst: 08.04.2007 23:04
von AND51
Aha! Vielleicht, weil die IDE nicht so viele Codes auf einmal öffnen kann?
Anderereseits: Ist das vielleicht der Grund, warum nur 1 Includedatei geöffnet wurde?

Verfasst: 08.04.2007 23:20
von ts-soft
Wenn die IDE schnell viele Dateien öffnen soll, spinnt sie. Aber egal, meist
sollte das Tools als Übergangslösung, bis es Projektmanagement gibt
ausreichen. Deswegen lohnt es auch nicht, das Tool schneller zu machen,
weil Zeilenweise einlesen ist ja nicht gerade das schnellste. Die Auslöser
reagieren wahrscheinlich sowieso zu langsam.

Wenns nützlich ist, benutzen, ansonsten sein lassen oder verbessern :wink:

Verfasst: 09.04.2007 00:07
von AND51
Hey, TS-Soft!

Wenn ich nur IncludeFiles habe, aber kein IncludePath, und alle IncldeFiles sind relative Angaben, welchen Pfad nimmt die IDE dann?

GetCurrentDirectory(), #PB_Compiler_Home oder den Pfad der Executable der IDE?

Sag mir das bitte, damit ich meine Version des "AutoOpenInclude" fertigstellen kann!


// Edit: Ich vermute, er nimmt den Pfad des Compilers, sieh her:

Code: Alles auswählen

XIncludeFile "PB_EditorOutput.pb"
Ergibt keine Fehlermeldung also wird es wohl das Verzeichnis zum Compiler sein! <)

Verfasst: 09.04.2007 00:18
von ts-soft
Er nimmt den Pfad zum gespeichertem Source!
Das aktuelle Verzeichnis wird vom Compiler gesetzt.

Da das IDE Tool von der IDE gestartet wird, sollte der Pfad autom. für diesen
Prozess stimmen, lediglich wenn man es solo startet, gibts Probleme

Verfasst: 09.04.2007 00:25
von AND51
Sorry, falsch ausgedrückt.

Bedingungen:
- Code nicht gespeichert
- kein IncludePath gegeben
- (X)IncludeFile wird relativ angegeben

Unter diesen Bedingungen nimmt er den Pfad #PB_Compiler_Home. Das habe ich festgestellt. Ansonsten nimmt er den Pfad der Datei, korrekt.


Bin fertig mit meinem Tool! Aber du hast Recht: Öffne ich alle Gefundenen Dateien auf einmal, erstellt er merhere Instanzen der IDE, daher
muss ein Delay her!