🙏 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!🍀

❤️ DANKE >> << DANKE ❤️

>> 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

Alles zur Programmierung im LibreOffice.
Antworten
dimpflmoser
Beiträge: 16
Registriert: So 2. Feb 2014, 15:19

Mehrspaltiges Tree Contol Element

Beitrag von dimpflmoser » Di 4. Feb 2014, 12:01

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

pmoegenb

Re: Mehrspaltiges Tree Contol Element

Beitrag von pmoegenb » Di 4. Feb 2014, 12:30

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.

dimpflmoser
Beiträge: 16
Registriert: So 2. Feb 2014, 15:19

Re: Mehrspaltiges Tree Contol Element

Beitrag von dimpflmoser » Di 4. Feb 2014, 12:39

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)

pmoegenb

Re: Mehrspaltiges Tree Contol Element

Beitrag von pmoegenb » Di 4. Feb 2014, 12:50

Hallo,

dann kann ich Dir nur diese Website empfehlen.

Koto
Beiträge: 19
Registriert: Do 30. Aug 2012, 17:05

Re: Mehrspaltiges Tree Contol Element

Beitrag von Koto » Mi 5. Feb 2014, 18:02

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)

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.



Antworten