Auskommentieren und Einrücken von Code-Zeilen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Proma
**
Beiträge: 20
Registriert: So, 03.05.2020 10:04

Auskommentieren und Einrücken von Code-Zeilen

Beitrag von Proma »

Hallo liebe Experten,

im IDE habe ich bislang vergeblich nach einer Möglichkeit gesucht, Code-Zeilen automatisiert und bei Bedarf auch blockweise auszukommentieren oder Einrücken vorzunehmen. Fündig geworden bin ich dann im OpenOffice-Forum, wo jemand 2009 (!) auch schon einmal so etwas nachgefragt hatte. Ein hilfreiches Mitglied des Forums hat dann einen Basic-Code ausfindig gemacht http://www.oooforum.de/viewtopic.php?t=30665,
der das Auskommentieren übernimmt. Diesen Code habe ich an meine Bedürfnisse angepasst und dahingehend erweitert, dass er nun auch das Einrücken von (markierten) Code-Zeilen übernimmt. Ist zwar noch nicht das Gelbe vom Ei, funktioniert aber zu meiner Zufriedenheit. Ist halt nur eine Krücke - und die ist bekanntlich besser als nix. Den Code stelle ich mal für alle Fälle hier ein, vielleicht kann ihn jemand brauchen.

Kann es sein, dass ich im IDE etwas übersehen habe oder machen alle Star-Basic Anwender diese Aktionen seit 2009 von Hand? Wenn Ihr Tipps für mich habt, dann lasst es mich bitte wissen.

Vielen Dank vorab und liebe Grüße
vom Martin

Und hier ist der Code. Kleiner Tipp noch am Rande: Diesen Code unter "Meine Makros" abspeichern und jedem Funktionsaufruf (das sind die ersten vier Prozeduren) eine Tastenkombination zuweisen (Extras / Anpassen... und im Dialog die Registerkarte "Tastatur" wählen. Viel Glück!

Code: Alles auswählen

REM  *****  BASIC  *****
'----------------------------------------------------
'  Makro Code-Zeilen                                |
'----------------------------------------------------
'  Dieses Makro ermöglicht dem Anwender,            |
'  für markierte Code-Zeilen autmatisiert           |
'  - Kommentierungszeichen zu setzen/entfernen      |
'  - horizontale Einzüge zu verkleinern/vergrößern  |
'----------------------------------------------------
'  Autor unbekannt                                  |
'  Code gefunden im OpenOffice-Forum,               |
'  http://www.oooforum.de/viewtopic.php?t=30665     |
'  Modifiziert am 07.05.2020 von Proma              |
'----------------------------------------------------
'  Für etwaige Schäden, die im Zusammenhang mit der |
'  Verwendung dieses Code stehen, wird keinerlei    |
'  Haftung übernommen.                              |
'----------------------------------------------------

'Fundstelle:
'http://www.oooforum.de/viewtopic.php?t=30665



Sub pCodeLn_Com_ON
'Starten mit [Strg]+[K]
'Fügt ein Kommentierungszeichen (Hochkomma ')
'am Beginn der markierten Code-Zeile(n) ein
  Call pCodeLines(True, False)
End Sub

Sub pCodeLn_Com_OFF
'Starten mit [Strg]+[N]
'Entfernt alle Kommentierungszeichen (Hochkomma ')
'am Beginn der markierten Code-Zeile(n)
  Call pCodeLines(True, True)
End Sub

Sub pCodeLn_Mov_R
'Starten mit [Strg]+[R]
'Fügt 2 Leerzeichen am Beginn
'der markierten Code-Zeile(n) ein
  Call pCodeLines(False, False)
End Sub

Sub pCodeLn_Mov_L
'Starten mit [Strg]+[L]
'Entfernt - sowiet vorhanden - 2 Leerzeichen
'am Beginn der markierten Code-Zeile(n)
  Call pCodeLines(False, True)
End Sub



Sub pCodeLines(ByVal bolREM as Boolean, bolCUT as Boolean)
  oBasicComp = getBasicWindow

  oContWin = oBasicComp.CurrentController.Frame.ComponentWindow
  oACScrollPane1 = oContWin.AccessibleContext.getAccessiblechild(0)
  oACPanel1 = oACScrollPane1.AccessibleContext.getAccessiblechild(2)
  oACPanel2 = oACPanel1.AccessibleContext.getAccessibleChild(4)
  oACScrollPane2 = oACPanel2.AccessibleContext.getAccessibleChild(0)
  oACTextFrame = oACScrollPane2.AccessibleContext.getAccessibleChild(1)

  iMaxPara = oACTextFrame.AccessibleContext.AccessibleChildCount-1
  aiParaSelected = getSelectedParas(oACTextFrame)
  Call commentParas(oACTextFrame, aiParaSelected, bolREM, bolCUT)
End Sub



Sub commentParas(oACTextFrame as Any, aiPara as Any, bolREM as Boolean, bolCUT as Boolean)
'Werte von bolREM:
'    TRUE  Setzt/entfernt Kommentierungszeichen am Zeilenanfang eines markierten Code-Blocks (Code-Zeilen [ent]kommentieren)
'    FALSE Setzt/entfernt 2 Leerzeichen am Zeilenanfang eines makrierten Code-Blocks  (Code-Zeilen nach links/rechts verschieben)

'Werte von bolCUT:
'    TRUE  je nach Einstellung von bolREM Kommentierungszeichen setzen bzw. Code-Zeilen nach LINKS  verschieben
'    FALSE je nach Einstellung von bolREM Kommentar.-Zeichen entfernen bzw. Code-Zeilen nach RECHTS verschieben


  If bolREM = True Then  
    If bolCUT=True Then

'   Kommentierungszeichen entfernen  
      For k = 0 To UBound(aiPara)
        oACP = oACTextFrame.AccessibleContext.getAccessibleChild(aiPara(k))
        If Left(oACP.Text,1) =  "'"  Then bResult = oACP.cutText(0,1)
      Next k

    Else

'   Kommentierungszeichen einfügen  
      For k = 0 To UBound(aiPara)
        oACP = oACTextFrame.AccessibleContext.getAccessibleChild(aiPara(k))
        bResult = oACP.insertText( "'", 0)
      Next k
    End IF  
  Else
    If bolCUT = True Then  

'   Zwei Leerzeichen entfernen --> Code-Zeilen nach LINKS verschieben
      For k = 0 To UBound(aiPara)
        oACP = oACTextFrame.AccessibleContext.getAccessibleChild(aiPara(k))
        For i = 1 to 2
          If Left(oACP.Text,1) =  " "  Then bResult = oACP.cutText(0,1)
        Next i  
      Next k
    
    Else

'   Zwei Leerzeichen einfügen --> Code-Zeilen nach RECHTS verschieben
      For k = 0 To UBound(aiPara)
        oACP = oACTextFrame.AccessibleContext.getAccessibleChild(aiPara(k))
        bResult = oACP.insertText( "  ", 0)
      Next k
    End If
  End if

End Sub



Function getSelectedParas(oACTextFrame as Any) as Any
  iMaxPara = oACTextFrame.AccessibleContext.AccessibleChildCount-1
  Dim aiParaSelected(iMaxPara) as integer

  iCount = 0
  For k = 0 to iMaxPara
    oACP = oACTextFrame.AccessibleContext.getAccessibleChild(k)
    If (oACP.SelectedText = oACP.Text) and (oACP.Text <> "") then
      aiParaSelected(iCount) = k
      iCount = iCount + 1
    End If
  Next k
  If iCount >= 1 Then
    Redim Preserve aiParaSelected(iCount-1)
    getSelectedParas = aiParaSelected
  Else
    getSelectedParas = Array()
  End If
End Function   


    
Function getBasicWindow() as Any
  oEnum = Stardesktop.Components.createEnumeration
  While oEnum.hasMoreElements
    oComp = oEnum.nextElement
    If HasUnoInterfaces(oComp, "com.sun.star.lang.XServiceInfo") Then     'to catch the Help Window
      If oComp.supportsService("com.sun.star.script.BasicIDE") Then
  	    oBasicComp = oComp
  	  End If
    End if
  Wend
  getBasicWindow = oBasicComp
End Function