🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱
🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀
>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗
Mehrspaltiges Tree Contol Element
-
- Beiträge: 16
- Registriert: So 2. Feb 2014, 15:19
Mehrspaltiges Tree Contol Element
Hallo zusammen,
ich bin recht neu in diesem Forum, obwohl ich schon recht lange mit LibreOffice (seit StarOffice 5.2) arbeite und Makros entwickle. Und hier direkt meine erste Frage.
In der Access-Entwicklung (muss ich auch machen) verwende ich manchmal das TreeView-Control zur Ausgabe von mehrspaltigen Listen. Nun frage ich mich, ob das auch in LibreOffice Dialogen geht, also, ob ich mit dem Tree-Steuerelement auch mehrspaltige Listen ausgeben kann. Ich habe recht lange gegooled, aber keinen entsprechenden Code gefunden. Kann mir jemand sagen, ob das prinzipiell geht und, wenn ja, hat vielleicht sogar jemand ein (Basic-) Beispiel?
Danke im Voraus
ich bin recht neu in diesem Forum, obwohl ich schon recht lange mit LibreOffice (seit StarOffice 5.2) arbeite und Makros entwickle. Und hier direkt meine erste Frage.
In der Access-Entwicklung (muss ich auch machen) verwende ich manchmal das TreeView-Control zur Ausgabe von mehrspaltigen Listen. Nun frage ich mich, ob das auch in LibreOffice Dialogen geht, also, ob ich mit dem Tree-Steuerelement auch mehrspaltige Listen ausgeben kann. Ich habe recht lange gegooled, aber keinen entsprechenden Code gefunden. Kann mir jemand sagen, ob das prinzipiell geht und, wenn ja, hat vielleicht sogar jemand ein (Basic-) Beispiel?
Danke im Voraus
Re: Mehrspaltiges Tree Contol Element
Du hast doch mit Sicherheit TreeView Control nicht programmiert, sondern einfach ins Formular gezogen.
Die möglichen Formular-Steuerelemente bekommst z. B. im Writer über Ansicht/Symbolleisten/Formular-Steuerelemente.
Die möglichen Formular-Steuerelemente bekommst z. B. im Writer über Ansicht/Symbolleisten/Formular-Steuerelemente.
-
- Beiträge: 16
- Registriert: So 2. Feb 2014, 15:19
Re: Mehrspaltiges Tree Contol Element
Hallo pmoegenb,
nein, ich meine schon das Dialog-Tree-Steuerelement - In Access befülle ich das dann mit VBA-Code und das würde ich in LibreOffice-Dialogen (nicht Formularen) auch gerne machen (um z.B. ResultSets als Auswahl anzuzeigen)
nein, ich meine schon das Dialog-Tree-Steuerelement - In Access befülle ich das dann mit VBA-Code und das würde ich in LibreOffice-Dialogen (nicht Formularen) auch gerne machen (um z.B. ResultSets als Auswahl anzuzeigen)
Re: Mehrspaltiges Tree Contol Element
Hallo,
ich habe damit experimentiert und auch Erfolge erzielt! Fand es nicht einfach, auch weil es da wenig zum googeln gibt. Der ganze Dialog des folgenden Codes enthält mehr Elemente als das TreeControl. Ich habe die Methoden dazu gelöscht. Zumindest sollte der Code Hilfe zum Experimentieren und googeln liefern. Ein Beispiel aus dem Ärmel schütteln kann ich leider auch nicht.
IndexDlg() startet den Dialog, am Ende sind einige Events zur Steuerung. Voraussetzung ist natürlich ein Dialog "IndexTreeDlg" in der Bibliothek Standard. Die Kinder werden nach dem Auslesen aus einer Datenbank erzeugt: setChilds (Node AS OBJECT)
ich habe damit experimentiert und auch Erfolge erzielt! Fand es nicht einfach, auch weil es da wenig zum googeln gibt. Der ganze Dialog des folgenden Codes enthält mehr Elemente als das TreeControl. Ich habe die Methoden dazu gelöscht. Zumindest sollte der Code Hilfe zum Experimentieren und googeln liefern. Ein Beispiel aus dem Ärmel schütteln kann ich leider auch nicht.
IndexDlg() startet den Dialog, am Ende sind einige Events zur Steuerung. Voraussetzung ist natürlich ein Dialog "IndexTreeDlg" in der Bibliothek Standard. Die Kinder werden nach dem Auslesen aus einer Datenbank erzeugt: setChilds (Node AS OBJECT)
Code: Alles auswählen
REM ***** BASIC *****
'* Die Wurzel des Baumes als MutableTreeDataModel aus
'* "com.sun.star.awt.tree.MutableTreeDataModel" die mit
'* TreeCtrl = Dlg.getControl("IndexTree") mit dem Dialog verknüpft
'* wird.
PRIVATE MutableTreeDataModel AS OBJECT
PRIVATE TreeModel AS OBJECT
PRIVATE SourceLb AS OBJECT
PRIVATE BookLb AS OBJECT
PRIVATE SideLb AS OBJECT
PRIVATE ParaLb AS OBJECT
PRIVATE ParaTx AS OBJECT
PRIVATE UpTitleBt AS OBJECT
PRIVATE UpSourceBt AS OBJECT
PRIVATE SpinNode AS OBJECT
PUBLIC SelectListener AS OBJECT
PUBLIC ExpansionListener AS OBJECT
PUBLIC CONST ROOTTITLE = "Alle Dokumente"
'Für Array
PUBLIC CONST FIRSTCHILD = 0
PUBLIC CONST SECONDCHILD = 1
PUBLIC CONST THIRDCHILD = 2
PRIVATE CONST DENTRYICON = "/usr/share/icons/nuvola/22x22/actions/edit-find.png"
PRIVATE CONST SOURCEICON = "/usr/share/icons/nuvola/22x22/apps/bookcase.png"
PRIVATE CONST SIDEICON = "/usr/share/icons/nuvola/16x16/actions/go-next-document.png"
PUBLIC CONST ABCCHILD = "ABC"
PUBLIC CONST DENTRYCHILD = "DENTRY"
PUBLIC CONST SOURCECHILD = "SOURCE"
PUBLIC CONST SIDECHILD = "SIDE"
PUBLIC CONST KEY2CHILD = "KEY2"
PUBLIC CONST KEY2SOURCECHILD = "KEY2" & SOURCECHILD
PUBLIC CONST KEY2SIDECHILD = "KEY2" & SIDECHILD
PUBLIC CONST KEY3CHILD = "KEY3"
PUBLIC CONST KEY3SOURCECHILD = "KEY3" & SOURCECHILD
PUBLIC CONST KEY3SIDECHILD = "KEY3" & SIDECHILD
PUBLIC CONST DUMMYCHILD = "DUMMY"
PRIVATE TreeCtrl AS OBJECT
PUBLIC SUB IndexDlg ()
DIM Dlg AS OBJECT
DIM ChildNode() AS OBJECT
DIM SubChildDummy() AS OBJECT
DIM Key1ABC() AS STRING
DIM i AS INTEGER
DialogLibraries.loadLibrary("Standard")
Dlg = CreateUnoDialog(DialogLibraries.Standard.IndexTreeDlg)
IF IsNull (Dlg) THEN
EXIT SUB
END IF
SelectListener = CreateUnoListener ("SelectEvent_", "com.sun.star.view.XSelectionChangeListener")
ExpansionListener = CreateUnoListener ("ExpansionEvent_", "com.sun.star.awt.tree.XTreeExpansionListener")
TreeCtrl = Dlg.getControl("IndexTree")
TreeModel = TreeCtrl.Model
'instantiate the MutableTreeDataModel service
MutableTreeDataModel = createUnoService(_
"com.sun.star.awt.tree.MutableTreeDataModel")
RootNode = MutableTreeDataModel.createNode (ROOTTITLE, TRUE)
RootNode.setCollapsedGraphicURL (ConvertToURL ("/usr/share/icons/oxygen/22x22/places/server-database.png" ))
RootNode.setExpandedGraphicURL (ConvertToURL ("/usr/share/icons/oxygen/22x22/places/server-database.png" ))
MutableTreeDataModel.setRoot (RootNode)
SourceLb = Dlg.getControl ("QuellLb")
BookLb = Dlg.getControl ("BuchLb")
SideLb = Dlg.getControl ("SeiteLb")
ParaLb = Dlg.getControl ("AbsatzLb")
ParaTx = Dlg.getControl ("AbsatzTx")
UpTitleBt = Dlg.getControl ("UpTitleBt")
enableButton (UpTitleBt, FALSE)
UpSourceBt = Dlg.getControl ("UpSourceBt")
enableButton (UpSourceBt, FALSE)
FOR i = 0 TO uBound (Key1ABC)
REDIM PRESERVE ChildNode(i)
ChildNode(i) = MutableTreeDataModel.createNode( Key1ABC(i) & "...", TRUE )
ChildNode(i).DataValue = ABCCHILD
ChildNode(i).setNodeGraphicURL (ConvertToURL ("/usr/share/icons/nuvola/22x22/places/folder-font.png" ))
RootNode.appendChild (ChildNode(i))
'Dummy zum Expandieren
setDummyChild (ChildNode(i))
Next
TreeModel.DataModel = MutableTreeDataModel
TreeCtrl.expandNode (RootNode)
TreeCtrl.addSelectionChangeListener (SelectListener)
TreeCtrl.addTreeExpansionListener (ExpansionListener)
Dlg.execute()
TreeCtrl.removeSelectionChangeListener (SelectListener)
TreeCtrl.removeTreeExpansionListener (ExpansionListener)
Dlg.dispose()
END SUB
REM -------------------------------------------------------------------
REM
REM Labels und Absatz
REM
REM -------------------------------------------------------------------
'* @brief Leert für \e BookLb, \e SourceLb, \e SideLb und \e ParaTx, und
'* \e ParaLb
PUBLIC SUB cleanLables ()
BookLb.Text = "Buchtitel"
SourceLb.Text = "Quelle"
SideLb.Text = ""
ParaLb.Text = ""
ParaTx.Text = ""
END SUB
REM -------------------------------------------------------------------
REM
REM Kinder
REM
REM -------------------------------------------------------------------
'* @brief Dummy, damit das Zeichen zum Expandieren erhalten bleibt,
'* wenn eine Knoten geleert wird
PRIVATE SUB setDummyChild (Node AS OBJECT)
DIM Dummy AS OBJECT
IF isNull (Node.getParent ()) THEN
EXIT SUB
END IF
Dummy = MutableTreeDataModel.createNode("...", FALSE )
Dummy.DataValue = DUMMYCHILD
Node.appendChild (Dummy)
END SUB
SUB deleteDummyChild (Node AS OBJECT)
DIM Parent AS OBject
DIM Child AS OBJECT
Parent = Node.getParent ()
IF isNull (Parent) THEN
EXIT SUB
END IF
Child = Node.getChildAt(0)
'Außer in der root nur Dummy enthalten
IF NOT isNull (Child) _
AND Child.DataValue = DUMMYCHILD _
THEN
Node.removeChildByIndex (0)
END IF
END SUB
SUB setChilds (Node AS OBJECT)
DIM ChildNode AS OBJECT
DIM i AS LONG
DIM Entry AS STRING
DIM Icon1 AS STRING
DIM Icon2 AS STRING
DIM Typ AS STRING
DIM ChildTyp1 AS STRING
DIM ChildTyp2 AS STRING
DIM ResultSet1 AS OBJECT
DIM ResultSet2 AS OBJECT
DIM IsKnot AS BOOLEAN
Typ = Node.DataValue
'Knoten mit >
IsKnot = TRUE
SELECT CASE Typ
CASE ABCCHILD
ResultSet1 = getDentryFromDb (Node.getDisplayValue ())
Icon1 = DENTRYICON
ChildTyp1 = DENTRYCHILD
CASE DENTRYCHILD
'1. Stichwort
ResultSet1 = getSourceFromDb (Node.getDisplayValue ())
ResultSet2 = getKey2FromDb (Node.getDisplayValue ())
Icon1 = SOURCEICON
ChildTyp1 = SOURCECHILD
Icon2 = DENTRYICON
ChildTyp2 = KEY2CHILD
CASE SOURCECHILD
ResultSet1 = getSideFromDb (Node)
'Knoten ohne >
IsKnot = FALSE
Icon1 = SIDEICON
ChildTyp1 = SIDECHILD
CASE KEY2CHILD
'2. Stichwort
ResultSet1 = getKey2SourceFromDb (Node.getDisplayValue ())
ResultSet2 = getKey3FromDb (Node)
Icon1 = SOURCEICON
ChildTyp1 = KEY2SOURCECHILD
Icon2 = DENTRYICON
ChildTyp2 = KEY3CHILD
CASE KEY2SOURCECHILD
ResultSet1 = getKey2SideFromDb (Node)
'Knoten ohne >
IsKnot = FALSE
Icon1 = SIDEICON
ChildTyp1 = KEY2SIDECHILD
CASE KEY3CHILD
'3. Stichwort
ResultSet1 = getKey3SourceFromDb (Node)
Icon1 = SOURCEICON
ChildTyp1 = KEY3SOURCECHILD
CASE KEY3SOURCECHILD
ResultSet1 = getKey3SideFromDb (Node)
'Knoten ohne >
IsKnot = FALSE
Icon1 = SIDEICON
ChildTyp1 = KEY3SIDECHILD
END SELECT
IF isNull (ResultSet1) THEN
EXIT SUB
END IF
'Stichwort und Quelleinträge
WHILE ResultSet1.next ()
'Format für Seitenangabe
IF inStr (Typ, "SOURCE") > 0 THEN
Entry = getFormat4Side (ResultSet1.getInt(1))
ELSE
Entry = ResultSet1.getString(1)
END IF
ChildNode = MutableTreeDataModel.createNode (Entry, IsKnot)
ChildNode.setNodeGraphicURL (ConvertToURL (Icon1))
ChildNode.DataValue = ChildTyp1
Node.appendChild (ChildNode)
WEND
IF isNull (ResultSet2) THEN
EXIT SUB
END IF
'Stichworte nächster Ebene
WHILE ResultSet2.next ()
Entry = ResultSet2.getString(1)
ChildNode = MutableTreeDataModel.createNode (Entry, TRUE)
ChildNode.setNodeGraphicURL (ConvertToURL (Icon2))
ChildNode.DataValue = ChildTyp2
Node.appendChild (ChildNode)
WEND
END SUB
SUB collapseOtherChild (Node AS OBJECT)
DIM Parent AS OBJECT
DIM ThisNode AS LONG
DIM NodeName AS STRING
DIM i AS LONG
DIM ChildCount AS INTEGER
'Beim ertenmal is nix da
IF isNull (Node) THEN
EXIT SUB
END IF
Parent = Node.getParent(Node)
'Root hat keine Eltern
IF isNull (Parent) THEN
EXIT SUB
END IF
NodeName = Node.DataValue
SELECT CASE NodeName
CASE ABCCHILD
ChildCount = Parent.getChildCount ()
ThisNode = Parent.getIndex (Node)
FOR i = 0 TO ChildCount - 1
IF NOT (ThisNode = i) THEN
IF TreeCtrl.isNodeExpanded (Parent.getChildAt(i)) THEN
TreeCtrl.collapseNode (Parent.getChildAt(i))
END IF
END IF
NEXT
CASE DENTRYCHILD
ChildCount = Parent.getChildCount ()
ThisNode = Parent.getIndex (Node)
FOR i = 0 TO ChildCount - 1
IF NOT (ThisNode = i) THEN
IF TreeCtrl.isNodeExpanded (Parent.getChildAt(i)) THEN
TreeCtrl.collapseNode (Parent.getChildAt(i))
END IF
END IF
NEXT
CASE SOURCECHILD
ChildCount = Parent.getChildCount ()
ThisNode = Parent.getIndex (Node)
FOR i = 0 TO ChildCount - 1
IF NOT (ThisNode = i) THEN
IF TreeCtrl.isNodeExpanded (Parent.getChildAt(i)) THEN
TreeCtrl.collapseNode (Parent.getChildAt(i))
END IF
END IF
NEXT
CASE SIDECHILD
ChildCount = Parent.getChildCount ()
ThisNode = Parent.getIndex (Node)
FOR i = 0 TO ChildCount - 1
IF NOT (ThisNode = i) THEN
IF TreeCtrl.isNodeExpanded (Parent.getChildAt(i)) THEN
TreeCtrl.collapseNode (Parent.getChildAt(i))
END IF
END IF
NEXT
CASE KEY2CHILD
ChildCount = Parent.getChildCount ()
ThisNode = Parent.getIndex (Node)
FOR i = 0 TO ChildCount - 1
IF NOT (ThisNode = i) THEN
IF TreeCtrl.isNodeExpanded (Parent.getChildAt(i)) THEN
TreeCtrl.collapseNode (Parent.getChildAt(i))
END IF
END IF
NEXT
CASE KEY2SIDECHILD
ChildCount = Parent.getChildCount ()
ThisNode = Parent.getIndex (Node)
FOR i = 0 TO ChildCount - 1
IF NOT (ThisNode = i) THEN
IF TreeCtrl.isNodeExpanded (Parent.getChildAt(i)) THEN
TreeCtrl.collapseNode (Parent.getChildAt(i))
END IF
END IF
NEXT
CASE KEY3CHILD
ChildCount = Parent.getChildCount ()
ThisNode = Parent.getIndex (Node)
FOR i = 0 TO ChildCount - 1
IF NOT (ThisNode = i) THEN
IF TreeCtrl.isNodeExpanded (Parent.getChildAt(i)) THEN
TreeCtrl.collapseNode (Parent.getChildAt(i))
END IF
END IF
NEXT
CASE KEY3SIDECHILD
ChildCount = Parent.getChildCount ()
ThisNode = Parent.getIndex (Node)
FOR i = 0 TO ChildCount - 1
IF NOT (ThisNode = i) THEN
IF TreeCtrl.isNodeExpanded (Parent.getChildAt(i)) THEN
TreeCtrl.collapseNode (Parent.getChildAt(i))
END IF
END IF
NEXT
END SELECT
END SUB
'Leert einen Knoten und setzt den Dummyeintrag
SUB clearNode (Node AS OBJECT)
DIM ChildCount AS INTEGER
'NICHT ROOT
IF NOT isNull (Node.getParent ()) THEN
ChildCount = Node.getChildCount ()
WHILE ChildCount > 0
Node.removeChildByIndex (ChildCount - 1)
ChildCount = Node.getChildCount ()
WEND
setDummyChild (Node)
END IF
END SUB
REM -------------------------------------------------------------------
REM
REM Event
REM
REM -------------------------------------------------------------------
SUB SelectEvent_selectionChanged (Event AS OBJECT)
DIM Selection AS OBJECT
DIM Parent AS OBJECT
DIM Index AS STRING
DIM Typ AS STRING
DIM Quote AS STRING
DIM Source AS STRING
DIM Side AS INTEGER
DIM Node AS OBJECT
DIM Dentry AS STRING
IF NOT isNull (Event.Source.getSelection ()) _
AND NOT isEmpty (Event.Source.getSelection ()) _
THEN
Selection = Event.Source.getSelection ()
'Warum Selection zum Array wird, weiß ich nicht
IF isArray (Selection) THEN
IF isNull (Selection(0)) THEN
EXIT SUB
END IF
Node = Selection(0)
Parent = Node.getParent ()
Typ = Node.DataValue
ELSE
Node = Selection
Parent = Selection.getParent ()
Typ = Selection.DataValue
END IF
'Ist nicht root
IF NOT isNull (Parent) THEN
IF inStr (Typ, SOURCECHILD) > 0 THEN
setSourceUrl (Node)
setTitle (Node)
enableButton (UpTitleBt, TRUE)
enableButton (UpSourceBt, TRUE)
ELSEIF inStr (Typ, SIDECHILD) > 0 THEN
setSourceUrl (Node)
setTitle (Node)
setParagraphNoAndText (Node)
setSideNo (Node)
setSpin (Node)
enableButton (UpTitleBt, TRUE)
enableButton (UpSourceBt, TRUE)
ELSE
enableButton (UpTitleBt, FALSE)
enableButton (UpSourceBt, FALSE)
cleanLables ()
END IF
END IF
END IF
END SUB
SUB ExpansionEvent_requestChildNodes (Event AS OBJECT)
setChilds (Event.Node)
END SUB
SUB ExpansionEvent_treeExpanding (Event AS OBJECT)
DIM Node AS OBJECT
Node = Event.Node
collapseOtherChild (Node)
deleteDummyChild (Node)
END SUB
SUB ExpansionEvent_treeCollapsing (Event AS OBJECT)
'Knoten leeren außer root
IF isNull (Event.Node.getParent ()) THEN
EXIT SUB
END IF
'Knoten leeren
clearNode (Event.Node)
END SUB
SUB ExpansionEvent_treeExpanded (Event AS OBJECT)
'deleteDummyChild (Event.Node)
END SUB
SUB ExpansionEvent_treeCollapsed (Event AS OBJECT)
IF isNull (Event.Node.getParent ()) THEN
TreeCtrl.expandNode (RootNode)
END IF
END SUB
An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:
Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.