You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787
  1. /*
  2. * Copyright 2000-2016 Vaadin Ltd.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License. You may obtain a copy of
  6. * the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations under
  14. * the License.
  15. */
  16. package com.vaadin.ui;
  17. import java.lang.reflect.Method;
  18. import java.util.Collection;
  19. import java.util.HashMap;
  20. import java.util.HashSet;
  21. import java.util.Map;
  22. import java.util.Objects;
  23. import java.util.Set;
  24. import com.vaadin.data.Binder;
  25. import com.vaadin.data.HasHierarchicalDataProvider;
  26. import com.vaadin.data.SelectionModel;
  27. import com.vaadin.data.TreeData;
  28. import com.vaadin.data.provider.DataGenerator;
  29. import com.vaadin.data.provider.DataProvider;
  30. import com.vaadin.data.provider.HierarchicalDataProvider;
  31. import com.vaadin.data.provider.TreeDataProvider;
  32. import com.vaadin.event.CollapseEvent;
  33. import com.vaadin.event.CollapseEvent.CollapseListener;
  34. import com.vaadin.event.ConnectorEvent;
  35. import com.vaadin.event.ExpandEvent;
  36. import com.vaadin.event.ExpandEvent.ExpandListener;
  37. import com.vaadin.event.SerializableEventListener;
  38. import com.vaadin.event.selection.SelectionListener;
  39. import com.vaadin.server.ErrorMessage;
  40. import com.vaadin.server.Resource;
  41. import com.vaadin.shared.Registration;
  42. import com.vaadin.shared.ui.ContentMode;
  43. import com.vaadin.shared.ui.grid.HeightMode;
  44. import com.vaadin.shared.ui.tree.TreeMultiSelectionModelState;
  45. import com.vaadin.shared.ui.tree.TreeRendererState;
  46. import com.vaadin.ui.Grid.SelectionMode;
  47. import com.vaadin.ui.components.grid.MultiSelectionModelImpl;
  48. import com.vaadin.ui.renderers.AbstractRenderer;
  49. import com.vaadin.util.ReflectTools;
  50. import elemental.json.JsonObject;
  51. /**
  52. * Tree component. A Tree can be used to select an item from a hierarchical set
  53. * of items.
  54. *
  55. * @author Vaadin Ltd
  56. * @since 8.1
  57. *
  58. * @param <T>
  59. * the data type
  60. */
  61. public class Tree<T> extends Composite
  62. implements HasHierarchicalDataProvider<T> {
  63. @Deprecated
  64. private static final Method ITEM_CLICK_METHOD = ReflectTools
  65. .findMethod(ItemClickListener.class, "itemClick", ItemClick.class);
  66. /**
  67. * A listener for item click events.
  68. *
  69. * @param <T>
  70. * the tree item type
  71. *
  72. * @see ItemClick
  73. * @see Registration
  74. * @since 8.1
  75. */
  76. @FunctionalInterface
  77. public interface ItemClickListener<T> extends SerializableEventListener {
  78. /**
  79. * Invoked when this listener receives a item click event from a Tree to
  80. * which it has been added.
  81. *
  82. * @param event
  83. * the received event, not {@code null}
  84. */
  85. public void itemClick(Tree.ItemClick<T> event);
  86. }
  87. /**
  88. * Tree item click event.
  89. *
  90. * @param <T>
  91. * the data type of tree
  92. * @since 8.1
  93. */
  94. public static class ItemClick<T> extends ConnectorEvent {
  95. private final T item;
  96. /**
  97. * Constructs a new item click.
  98. *
  99. * @param source
  100. * the tree component
  101. * @param item
  102. * the clicked item
  103. */
  104. protected ItemClick(Tree<T> source, T item) {
  105. super(source);
  106. this.item = item;
  107. }
  108. /**
  109. * Returns the clicked item.
  110. *
  111. * @return the clicked item
  112. */
  113. public T getItem() {
  114. return item;
  115. }
  116. @SuppressWarnings("unchecked")
  117. @Override
  118. public Tree<T> getSource() {
  119. return (Tree<T>) super.getSource();
  120. }
  121. }
  122. /**
  123. * String renderer that handles icon resources and stores their identifiers
  124. * into data objects.
  125. *
  126. * @since 8.1
  127. */
  128. public final class TreeRenderer extends AbstractRenderer<T, String>
  129. implements DataGenerator<T> {
  130. /**
  131. * Constructs a new TreeRenderer.
  132. */
  133. protected TreeRenderer() {
  134. super(String.class);
  135. }
  136. private Map<T, String> resourceKeyMap = new HashMap<>();
  137. private int counter = 0;
  138. @Override
  139. public void generateData(T item, JsonObject jsonObject) {
  140. Resource resource = iconProvider.apply(item);
  141. if (resource == null) {
  142. destroyData(item);
  143. return;
  144. }
  145. if (!resourceKeyMap.containsKey(item)) {
  146. resourceKeyMap.put(item, "icon" + (counter++));
  147. }
  148. setResource(resourceKeyMap.get(item), resource);
  149. jsonObject.put("itemIcon", resourceKeyMap.get(item));
  150. }
  151. @Override
  152. public void destroyData(T item) {
  153. if (resourceKeyMap.containsKey(item)) {
  154. setResource(resourceKeyMap.get(item), null);
  155. resourceKeyMap.remove(item);
  156. }
  157. }
  158. @Override
  159. public void destroyAllData() {
  160. Set<T> keys = new HashSet<>(resourceKeyMap.keySet());
  161. for (T key : keys) {
  162. destroyData(key);
  163. }
  164. }
  165. @Override
  166. protected TreeRendererState getState() {
  167. return (TreeRendererState) super.getState();
  168. }
  169. @Override
  170. protected TreeRendererState getState(boolean markAsDirty) {
  171. return (TreeRendererState) super.getState(markAsDirty);
  172. }
  173. }
  174. /**
  175. * Custom MultiSelectionModel for Tree. TreeMultiSelectionModel does not
  176. * show selection column.
  177. *
  178. * @param <T>
  179. * the tree item type
  180. *
  181. * @since 8.1
  182. */
  183. public final static class TreeMultiSelectionModel<T>
  184. extends MultiSelectionModelImpl<T> {
  185. @Override
  186. protected TreeMultiSelectionModelState getState() {
  187. return (TreeMultiSelectionModelState) super.getState();
  188. }
  189. @Override
  190. protected TreeMultiSelectionModelState getState(boolean markAsDirty) {
  191. return (TreeMultiSelectionModelState) super.getState(markAsDirty);
  192. }
  193. }
  194. private TreeGrid<T> treeGrid = new TreeGrid<>();
  195. private ItemCaptionGenerator<T> captionGenerator = String::valueOf;
  196. private IconGenerator<T> iconProvider = t -> null;
  197. private final TreeRenderer renderer;
  198. /**
  199. * Constructs a new Tree Component.
  200. */
  201. public Tree() {
  202. setCompositionRoot(treeGrid);
  203. renderer = new TreeRenderer();
  204. treeGrid.getDataCommunicator().addDataGenerator(renderer);
  205. treeGrid.addColumn(i -> captionGenerator.apply(i), renderer)
  206. .setId("column");
  207. treeGrid.setHierarchyColumn("column");
  208. while (treeGrid.getHeaderRowCount() > 0) {
  209. treeGrid.removeHeaderRow(0);
  210. }
  211. treeGrid.setPrimaryStyleName("v-tree8");
  212. treeGrid.setRowHeight(28);
  213. setWidth("100%");
  214. treeGrid.setHeightUndefined();
  215. treeGrid.setHeightMode(HeightMode.UNDEFINED);
  216. treeGrid.addExpandListener(e -> fireExpandEvent(e.getExpandedItem(),
  217. e.isUserOriginated()));
  218. treeGrid.addCollapseListener(e -> fireCollapseEvent(
  219. e.getCollapsedItem(), e.isUserOriginated()));
  220. treeGrid.addItemClickListener(
  221. e -> fireEvent(new ItemClick<>(this, e.getItem())));
  222. }
  223. /**
  224. * Constructs a new Tree Component with given caption.
  225. *
  226. * @param caption
  227. * the caption for component
  228. */
  229. public Tree(String caption) {
  230. this();
  231. setCaption(caption);
  232. }
  233. /**
  234. * Constructs a new Tree Component with given caption and {@code TreeData}.
  235. *
  236. * @param caption
  237. * the caption for component
  238. * @param treeData
  239. * the tree data for component
  240. */
  241. public Tree(String caption, TreeData<T> treeData) {
  242. this(caption, new TreeDataProvider<>(treeData));
  243. }
  244. /**
  245. * Constructs a new Tree Component with given caption and
  246. * {@code HierarchicalDataProvider}.
  247. *
  248. * @param caption
  249. * the caption for component
  250. * @param dataProvider
  251. * the hierarchical data provider for component
  252. */
  253. public Tree(String caption, HierarchicalDataProvider<T, ?> dataProvider) {
  254. this(caption);
  255. treeGrid.setDataProvider(dataProvider);
  256. }
  257. /**
  258. * Constructs a new Tree Component with given
  259. * {@code HierarchicalDataProvider}.
  260. *
  261. * @param dataProvider
  262. * the hierarchical data provider for component
  263. */
  264. public Tree(HierarchicalDataProvider<T, ?> dataProvider) {
  265. this(null, dataProvider);
  266. }
  267. @Override
  268. public HierarchicalDataProvider<T, ?> getDataProvider() {
  269. return treeGrid.getDataProvider();
  270. }
  271. @Override
  272. public void setDataProvider(DataProvider<T, ?> dataProvider) {
  273. treeGrid.setDataProvider(dataProvider);
  274. }
  275. /**
  276. * Adds an ExpandListener to this Tree.
  277. *
  278. * @see ExpandEvent
  279. *
  280. * @param listener
  281. * the listener to add
  282. * @return a registration for the listener
  283. */
  284. public Registration addExpandListener(ExpandListener<T> listener) {
  285. return addListener(ExpandEvent.class, listener,
  286. ExpandListener.EXPAND_METHOD);
  287. }
  288. /**
  289. * Adds a CollapseListener to this Tree.
  290. *
  291. * @see CollapseEvent
  292. *
  293. * @param listener
  294. * the listener to add
  295. * @return a registration for the listener
  296. */
  297. public Registration addCollapseListener(CollapseListener<T> listener) {
  298. return addListener(CollapseEvent.class, listener,
  299. CollapseListener.COLLAPSE_METHOD);
  300. }
  301. /**
  302. * Fires an expand event with given item.
  303. *
  304. * @param item
  305. * the expanded item
  306. * @param userOriginated
  307. * whether the expand was triggered by a user interaction or the
  308. * server
  309. */
  310. protected void fireExpandEvent(T item, boolean userOriginated) {
  311. fireEvent(new ExpandEvent<>(this, item, userOriginated));
  312. }
  313. /**
  314. * Fires a collapse event with given item.
  315. *
  316. * @param item
  317. * the collapsed item
  318. * @param userOriginated
  319. * whether the collapse was triggered by a user interaction or
  320. * the server
  321. */
  322. protected void fireCollapseEvent(T item, boolean userOriginated) {
  323. fireEvent(new CollapseEvent<>(this, item, userOriginated));
  324. }
  325. /**
  326. * Expands the given items.
  327. * <p>
  328. * If an item is currently expanded, does nothing. If an item does not have
  329. * any children, does nothing.
  330. *
  331. * @param items
  332. * the items to expand
  333. */
  334. public void expand(T... items) {
  335. treeGrid.expand(items);
  336. }
  337. /**
  338. * Expands the given items.
  339. * <p>
  340. * If an item is currently expanded, does nothing. If an item does not have
  341. * any children, does nothing.
  342. *
  343. * @param items
  344. * the items to expand
  345. */
  346. public void expand(Collection<T> items) {
  347. treeGrid.expand(items);
  348. }
  349. /**
  350. * Collapse the given items.
  351. * <p>
  352. * For items that are already collapsed, does nothing.
  353. *
  354. * @param items
  355. * the collection of items to collapse
  356. */
  357. public void collapse(T... items) {
  358. treeGrid.collapse(items);
  359. }
  360. /**
  361. * Collapse the given items.
  362. * <p>
  363. * For items that are already collapsed, does nothing.
  364. *
  365. * @param items
  366. * the collection of items to collapse
  367. */
  368. public void collapse(Collection<T> items) {
  369. treeGrid.collapse(items);
  370. }
  371. /**
  372. * This method is a shorthand that delegates to the currently set selection
  373. * model.
  374. *
  375. * @see #getSelectionModel()
  376. *
  377. * @return set of selected items
  378. */
  379. public Set<T> getSelectedItems() {
  380. return treeGrid.getSelectedItems();
  381. }
  382. /**
  383. * This method is a shorthand that delegates to the currently set selection
  384. * model.
  385. *
  386. * @param item
  387. * item to select
  388. *
  389. * @see SelectionModel#select(Object)
  390. * @see #getSelectionModel()
  391. */
  392. public void select(T item) {
  393. treeGrid.select(item);
  394. }
  395. /**
  396. * This method is a shorthand that delegates to the currently set selection
  397. * model.
  398. *
  399. * @param item
  400. * item to deselect
  401. *
  402. * @see SelectionModel#deselect(Object)
  403. * @see #getSelectionModel()
  404. */
  405. public void deselect(T item) {
  406. treeGrid.deselect(item);
  407. }
  408. /**
  409. * Adds a selection listener to the current selection model.
  410. * <p>
  411. * <strong>NOTE:</strong> If selection mode is switched with
  412. * {@link setSelectionMode(SelectionMode)}, then this listener is not
  413. * triggered anymore when selection changes!
  414. *
  415. * @param listener
  416. * the listener to add
  417. * @return a registration handle to remove the listener
  418. *
  419. * @throws UnsupportedOperationException
  420. * if selection has been disabled with
  421. * {@link SelectionMode.NONE}
  422. */
  423. public Registration addSelectionListener(SelectionListener<T> listener) {
  424. return treeGrid.addSelectionListener(listener);
  425. }
  426. /**
  427. * Use this tree as a single select in {@link Binder}. Throws
  428. * {@link IllegalStateException} if the tree is not using
  429. * {@link SelectionMode#SINGLE}.
  430. *
  431. * @return the single select wrapper that can be used in binder
  432. */
  433. public SingleSelect<T> asSingleSelect() {
  434. return treeGrid.asSingleSelect();
  435. }
  436. /**
  437. * Returns the selection model for this Tree.
  438. *
  439. * @return the selection model, not <code>null</code>
  440. */
  441. public SelectionModel<T> getSelectionModel() {
  442. return treeGrid.getSelectionModel();
  443. }
  444. /**
  445. * Sets the item caption generator that is used to produce the strings shown
  446. * as the text for each item. By default, {@link String#valueOf(Object)} is
  447. * used.
  448. *
  449. * @param captionGenerator
  450. * the item caption provider to use, not <code>null</code>
  451. */
  452. public void setItemCaptionGenerator(
  453. ItemCaptionGenerator<T> captionGenerator) {
  454. Objects.requireNonNull(captionGenerator,
  455. "Caption generator must not be null");
  456. this.captionGenerator = captionGenerator;
  457. treeGrid.getDataCommunicator().reset();
  458. }
  459. /**
  460. * Sets the item icon generator that is used to produce custom icons for
  461. * items. The generator can return <code>null</code> for items with no icon.
  462. *
  463. * @see IconGenerator
  464. *
  465. * @param iconGenerator
  466. * the item icon generator to set, not <code>null</code>
  467. * @throws NullPointerException
  468. * if {@code itemIconGenerator} is {@code null}
  469. */
  470. public void setItemIconGenerator(IconGenerator<T> iconGenerator) {
  471. Objects.requireNonNull(iconGenerator,
  472. "Item icon generator must not be null");
  473. this.iconProvider = iconGenerator;
  474. treeGrid.getDataCommunicator().reset();
  475. }
  476. /**
  477. * Sets the item collapse allowed provider for this Tree. The provider
  478. * should return {@code true} for any item that the user can collapse.
  479. * <p>
  480. * <strong>Note:</strong> This callback will be accessed often when sending
  481. * data to the client. The callback should not do any costly operations.
  482. *
  483. * @param provider
  484. * the item collapse allowed provider, not {@code null}
  485. */
  486. public void setItemCollapseAllowedProvider(
  487. ItemCollapseAllowedProvider<T> provider) {
  488. treeGrid.setItemCollapseAllowedProvider(provider);
  489. }
  490. /**
  491. * Sets the style generator that is used for generating class names for
  492. * items in this tree. Returning null from the generator results in no
  493. * custom style name being set.
  494. *
  495. * @see StyleGenerator
  496. *
  497. * @param styleGenerator
  498. * the item style generator to set, not {@code null}
  499. * @throws NullPointerException
  500. * if {@code styleGenerator} is {@code null}
  501. */
  502. public void setStyleGenerator(StyleGenerator<T> styleGenerator) {
  503. treeGrid.setStyleGenerator(styleGenerator);
  504. }
  505. /**
  506. * Gets the item caption generator.
  507. *
  508. * @return the item caption generator
  509. */
  510. public ItemCaptionGenerator<T> getItemCaptionGenerator() {
  511. return captionGenerator;
  512. }
  513. /**
  514. * Gets the item icon generator.
  515. *
  516. * @see IconGenerator
  517. *
  518. * @return the item icon generator
  519. */
  520. public IconGenerator<T> getItemIconGenerator() {
  521. return iconProvider;
  522. }
  523. /**
  524. * Gets the item collapse allowed provider.
  525. *
  526. * @return the item collapse allowed provider
  527. */
  528. public ItemCollapseAllowedProvider<T> getItemCollapseAllowedProvider() {
  529. return treeGrid.getItemCollapseAllowedProvider();
  530. }
  531. /**
  532. * Gets the style generator.
  533. *
  534. * @see StyleGenerator
  535. *
  536. * @return the item style generator
  537. */
  538. public StyleGenerator<T> getStyleGenerator() {
  539. return treeGrid.getStyleGenerator();
  540. }
  541. /**
  542. * Adds an item click listener. The listener is called when an item of this
  543. * {@code Tree} is clicked.
  544. *
  545. * @param listener
  546. * the item click listener, not null
  547. * @return a registration for the listener
  548. */
  549. public Registration addItemClickListener(ItemClickListener<T> listener) {
  550. return addListener(ItemClick.class, listener, ITEM_CLICK_METHOD);
  551. }
  552. /**
  553. * Sets the tree's selection mode.
  554. * <p>
  555. * The built-in selection modes are:
  556. * <ul>
  557. * <li>{@link SelectionMode#SINGLE} <b>the default model</b></li>
  558. * <li>{@link SelectionMode#MULTI}</li>
  559. * <li>{@link SelectionMode#NONE} preventing selection</li>
  560. * </ul>
  561. *
  562. * @param selectionMode
  563. * the selection mode to switch to, not {@code null}
  564. * @return the used selection model
  565. *
  566. * @see SelectionMode
  567. */
  568. public SelectionModel<T> setSelectionMode(SelectionMode selectionMode) {
  569. Objects.requireNonNull(selectionMode,
  570. "Can not set selection mode to null");
  571. switch (selectionMode) {
  572. case MULTI:
  573. TreeMultiSelectionModel<T> model = new TreeMultiSelectionModel<>();
  574. treeGrid.setSelectionModel(model);
  575. return model;
  576. default:
  577. return treeGrid.setSelectionMode(selectionMode);
  578. }
  579. }
  580. /**
  581. * @deprecated This component's height is always set to be undefined.
  582. * Calling this method will have no effect.
  583. */
  584. @Override
  585. @Deprecated
  586. public void setHeight(String height) {
  587. }
  588. /**
  589. * @deprecated This component's height is always set to be undefined.
  590. * Calling this method will have no effect.
  591. */
  592. @Override
  593. @Deprecated
  594. public void setHeight(float height, Unit unit) {
  595. }
  596. /**
  597. * @deprecated This component's height is always set to be undefined.
  598. * Calling this method will have no effect.
  599. */
  600. @Override
  601. @Deprecated
  602. public void setHeightUndefined() {
  603. }
  604. @Override
  605. public void setCaption(String caption) {
  606. treeGrid.setCaption(caption);
  607. }
  608. @Override
  609. public String getCaption() {
  610. return treeGrid.getCaption();
  611. }
  612. @Override
  613. public void setIcon(Resource icon) {
  614. treeGrid.setIcon(icon);
  615. }
  616. @Override
  617. public Resource getIcon() {
  618. return treeGrid.getIcon();
  619. }
  620. @Override
  621. public String getStyleName() {
  622. return treeGrid.getStyleName();
  623. }
  624. @Override
  625. public void setStyleName(String style) {
  626. treeGrid.setStyleName(style);
  627. }
  628. @Override
  629. public void setStyleName(String style, boolean add) {
  630. treeGrid.setStyleName(style, add);
  631. }
  632. @Override
  633. public void addStyleName(String style) {
  634. treeGrid.addStyleName(style);
  635. }
  636. @Override
  637. public void removeStyleName(String style) {
  638. treeGrid.removeStyleName(style);
  639. }
  640. @Override
  641. public String getPrimaryStyleName() {
  642. return treeGrid.getPrimaryStyleName();
  643. }
  644. @Override
  645. public void setPrimaryStyleName(String style) {
  646. treeGrid.setPrimaryStyleName(style);
  647. }
  648. @Override
  649. public void setId(String id) {
  650. treeGrid.setId(id);
  651. }
  652. @Override
  653. public String getId() {
  654. return treeGrid.getId();
  655. }
  656. @Override
  657. public void setCaptionAsHtml(boolean captionAsHtml) {
  658. treeGrid.setCaptionAsHtml(captionAsHtml);
  659. }
  660. @Override
  661. public boolean isCaptionAsHtml() {
  662. return treeGrid.isCaptionAsHtml();
  663. }
  664. @Override
  665. public void setDescription(String description) {
  666. treeGrid.setDescription(description);
  667. }
  668. @Override
  669. public void setDescription(String description, ContentMode mode) {
  670. treeGrid.setDescription(description, mode);
  671. }
  672. @Override
  673. public ErrorMessage getErrorMessage() {
  674. return treeGrid.getErrorMessage();
  675. }
  676. @Override
  677. public ErrorMessage getComponentError() {
  678. return treeGrid.getComponentError();
  679. }
  680. @Override
  681. public void setComponentError(ErrorMessage componentError) {
  682. treeGrid.setComponentError(componentError);
  683. }
  684. /**
  685. * Sets the height of a row. If -1 (default), the row height is calculated
  686. * based on the theme for an empty row before the Tree is displayed.
  687. *
  688. * @param rowHeight
  689. * The height of a row in pixels or -1 for automatic calculation
  690. */
  691. public void setRowHeight(double rowHeight) {
  692. treeGrid.setRowHeight(rowHeight);
  693. }
  694. /**
  695. * Sets the content mode of the item caption.
  696. *
  697. * @param contentMode
  698. * the content mode
  699. */
  700. public void setContentMode(ContentMode contentMode) {
  701. renderer.getState().mode = contentMode;
  702. }
  703. }