模块 java.desktop

类 View

java.lang.Object
javax.swing.text.View
所有已实现的接口:
SwingConstants
已知子类:
AsyncBoxView , ComponentView , CompositeView , GlyphView , IconView , ImageView , PlainView

public abstract class View extends Object implements SwingConstants

文本包的一个非常重要的部分是View类。顾名思义,它代表文本模型的一个视图,或者文本模型的一个片段。正是这个类负责文本组件的外观。视图并不是要成为一个必须学习的全新事物,而是更像是一个轻量级组件。

默认情况下,视图非常亮。它包含对父视图的引用,它可以从中获取很多东西而无需保持状态,并且它包含对模型的一部分(Element)的引用。视图不必准确地表示模型中的元素,这只是一个典型且方便的映射。视图可以选择维护几个 Position 对象以维护其在模型中的位置(即表示元素的片段)。这通常是格式化的结果,其中视图被分解成多个部分。与元素的实质关系的便利性使得构建工厂来生成视图变得更加容易,并且在模型更改时更容易跟踪视图片段,并且视图必须更改以反映模型。因此,简单视图直接表示一个元素,而复杂视图则不。

视图具有以下职责:

参与布局。

该视图有一个 setSize 方法,类似于 Component 中的 doLayoutsetSize 组合。该视图有一个 preferenceChanged 方法,它类似于 Component 中的 invalidate ,除了可以使一个轴无效并且请求更改的子项被识别。

视图根据三个值(最小跨度、首选跨度和最大跨度)表达它想要的大小。视图中的布局可以在每个轴上独立完成。对于正常运行的 View 实现,最小跨度将 <= 首选跨度,而首选跨度又将 <= 最大跨度。

The above text describes this graphic.

布局的最小方法集是:

setSize 方法应该准备好被多次调用(即即使大小没有改变也可能被调用)。 setSize 方法通常被调用以确保视图布局在尝试对其执行需要最新布局的操作之前是完整的。视图的大小应always设置为该视图指定的最小和最大范围内的值。此外,如果视图更改了它想要的布局值,并且希望父级遵守,则视图必须始终调用父级的 preferenceChanged 方法。在发送 preferenceChanged 之前,父视图不需要识别更改。如果需要,这允许父视图实现缓存子需求。调用序列如下所示:

Sample calling sequence between parent view and child view:
       setSize, getMinimum, getPreferred, getMaximum, getAlignment, setSize

确切的调用顺序取决于父视图的布局功能(如果视图有任何子视图)。视图可以在确定给每个子级什么之前收集子级的偏好,或者它可以一次一个地迭代更新子级。

渲染模型的一部分。

这是在 paint 方法中完成的,它非常类似于组件的 paint 方法。预计视图可能会填充相当大的树。 View 具有以下渲染语义:

  • 视图在绘制时从父级获得分配,因此如果分配的区域与它准备处理的区域不同,它必须准备重新布局。
  • 坐标系与宿主 Component 相同(即 getContainer 方法返回的 Component)。这意味着子视图与父视图位于同一坐标系中,除非父视图明确更改了坐标系。要安排自己重新绘制视图,可以在托管 Component 上调用重新绘制。
  • 默认是not clip 孩子。仅当视图确实需要裁剪时才允许裁剪它会更有效。
  • 给定的 Graphics 对象未以任何方式初始化。视图应设置所需的任何设置。
  • View 本质上是透明的。虽然视图可能会呈现到其整个分配中,但通常情况下视图不会。渲染是通过向下遍历 View 实现的树来执行的。每个 View 负责渲染其子项。此行为取决于线程安全。虽然视图实现不一定必须考虑线程安全,但其他确实使用并发的视图实现可以依赖于树遍历来保证线程安全。
  • 视图相对于模型的顺序取决于实现。虽然子视图通常会按照它们在模型中出现的相同顺序排列,但它们在视觉上可能会以完全不同的顺序排列。如果子视图重叠,则视图实现可能具有与之关联的 Z 顺序。

渲染的方法有:

在模型和视图坐标系之间转换。

由于视图对象是从工厂生产的,因此不一定指望它们处于特定模式中,因此必须能够执行转换以正确定位模型的空间表示。这样做的方法是:

在尝试进行翻译之前,布局必须有效。翻译无效,并且在通过 DocumentEvent 从模型广播更改时不得尝试。

响应模型的变化。

如果整体视图由许多部分表示(如果希望能够更改视图并编写最少数量的新代码,这是最好的情况),那么拥有大量的 DocumentListener 是不切实际的。如果每个视图都听模型,那么在任何给定时间实际上只有少数人会对广播的更改感兴趣。由于模型不了解视图,因此无法过滤更改信息的广播。视图层次结构本身负责传播更改信息。在视图层次结构中的任何级别,该视图都充分了解其子视图以最好地进一步分发更改信息。因此,更改从视图层次结构的根开始广播。这样做的方法是:

  • 字段详细信息

  • 构造方法详细信息

    • View

      public View(Element  elem)
      创建一个新的 View 对象。
      参数:
      elem - Element 代表
  • 方法详情

    • getParent

      public View  getParent()
      返回视图的父级。
      返回:
      父母,或 null 如果不存在
    • isVisible

      public boolean isVisible()
      返回一个boolean,指示视图是否可见。默认情况下,所有视图都是可见的。
      返回:
      总是返回真
    • getPreferredSpan

      public abstract float getPreferredSpan(int axis)
      确定此视图沿轴的首选跨度。
      参数:
      axis - 可能是 View.X_AXISView.Y_AXIS
      返回:
      视图要渲染到的跨度。通常情况下,视图会被告知渲染到返回的范围内,但并不能保证。父级可以选择调整大小或打破视图
    • getMinimumSpan

      public float getMinimumSpan(int axis)
      确定此视图沿轴的最小跨度。
      参数:
      axis - 可能是 View.X_AXISView.Y_AXIS
      返回:
      视图可以渲染到的最小跨度
      参见:
    • getMaximumSpan

      public float getMaximumSpan(int axis)
      确定此视图沿轴的最大跨度。
      参数:
      axis - 可能是 View.X_AXISView.Y_AXIS
      返回:
      视图可以渲染到的最大跨度
      参见:
    • preferenceChanged

      public void preferenceChanged(View  child, boolean width, boolean height)
      子视图可以在父视图上调用它以指示首选项已更改并且应该重新考虑布局。默认情况下,这只会向上传播到下一个父级。根视图将在关联的文本组件上调用 revalidate
      参数:
      child - 子视图
      width - 如果宽度首选项已更改,则为真
      height - 如果高度偏好已更改,则为真
      参见:
    • getAlignment

      public float getAlignment(int axis)
      确定此视图沿轴的所需对齐方式。返回所需的对齐方式。这应该是一个 >= 0.0 且 <= 1.0 的值,其中 0 表示对齐原点,1.0 表示对齐远离原点的整个跨度。 0.5 的对齐将是视图的中心。
      参数:
      axis - 可能是 View.X_AXISView.Y_AXIS
      返回:
      值 0.5
    • paint

      public abstract void paint(Graphics  g, Shape  allocation)
      使用给定的渲染表面和该表面上的区域进行渲染。视图可能需要进行布局并创建子视图以使其自身能够呈现给定的分配。
      参数:
      g - 要使用的渲染表面
      allocation - 要渲染到的分配区域
    • setParent

      public void setParent(View  parent)
      为此视图建立父视图。如果父视图正常运行,则保证在任何其他方法之前调用它。这也是最后调用的方法,因为它被调用以指示视图也已从层次结构中删除。当调用此方法将父项设置为 null 时,此方法对其每个子项执行相同操作,传播它们已与视图树断开连接的通知。如果重新实现,则应调用 super.setParent()
      参数:
      parent - 新的父级,或者 null 如果视图从父级移除
    • getViewCount

      public int getViewCount()
      返回此视图中的视图数。由于默认不是复合视图,因此返回 0。
      返回:
      观看次数 >= 0
      参见:
    • getView

      public View  getView(int n)
      获取n第子视图。由于默认情况下没有孩子,因此返回 null
      参数:
      n - 要获取的视图数,>= 0 && < getViewCount()
      返回:
      风景
    • removeAll

      public void removeAll()
      删除所有子项。这是对 replace 的方便调用。
      自从:
      1.3
    • remove

      public void remove(int i)
      删除给定位置的其中一个孩子。这是对 replace 的方便调用。
      参数:
      i - 位置
      自从:
      1.3
    • insert

      public void insert(int offs, View  v)
      插入单个子视图。这是对 replace 的方便调用。
      参数:
      offs - 在 >= 0 之前插入的视图的偏移量
      v - 视图
      自从:
      1.3
      参见:
    • append

      public void append(View  v)
      追加单个子视图。这是对 replace 的方便调用。
      参数:
      v - 视图
      自从:
      1.3
      参见:
    • replace

      public void replace(int offset, int length, View [] views)
      替换子视图。如果没有要删除的视图,这将充当插入。如果没有要添加的视图,这将作为删除。被删除的视图会将父级设置为 null ,并删除对它们的内部引用,以便它们可以被垃圾收集。这是什么都不做的实现,因为默认情况下视图没有子项。
      参数:
      offset - 插入新视图的子视图的起始索引。这应该是一个值 >= 0 且 <= getViewCount
      length - 要删除的现有子视图的数量这应该是一个 >= 0 且 <= (getViewCount() - offset) 的值。
      views - 要添加的子视图。此值可以是 null 以指示未添加任何子项(对于删除很有用)。
      自从:
      1.3
    • getViewIndex

      public int getViewIndex(int pos, Position.Bias  b)
      返回表示模型中给定位置的子视图索引。默认情况下,视图没有子项,因此实现返回 -1 以指示任何位置都没有有效的子索引。
      参数:
      pos - 位置 >= 0
      b - 偏差
      返回:
      表示给定位置的视图的索引,如果没有视图表示该位置,则为 -1
      自从:
      1.3
    • getChildAllocation

      public Shape  getChildAllocation(int index, Shape  a)
      获取给定子视图的分配。这使得能够找出各种视图所在的位置,而无需假设视图如何存储它们的位置。这将返回 null,因为默认情况下没有任何子视图。
      参数:
      index - 孩子的索引,>= 0 && < getViewCount()
      a - 分配给这个视图
      返回:
      分配给子级
    • getNextVisualPositionFrom

      public int getNextVisualPositionFrom(int pos, Position.Bias  b, Shape  a, int direction, Position.Bias [] biasRet) throws BadLocationException
      提供一种方法来确定下一个可以放置插入符号的可视化表示的模型位置。某些视图可能不可见,它们可能与模型中的顺序不同,或者它们可能不允许访问模型中的某些位置。该方法可以指定一个位置在 >=0 的范围内进行转换。如果值为-1,将自动计算位置。如果值 < -1,将抛出 BadLocationException
      参数:
      pos - 要转换的位置
      b - 偏差
      a - 渲染的分配区域
      direction - 从当前位置开始的方向,可以被认为是通常在键盘上找到的箭头键。这将是以下值之一:
      • SwingConstants.WEST
      • SwingConstants.EAST
      • SwingConstants.NORTH
      • SwingConstants.SOUTH
      biasRet - 返回的偏差
      返回:
      模型中最能代表下一个位置视觉位置的位置
      抛出:
      BadLocationException - 给定位置不是文档中的有效位置
      IllegalArgumentException - 如果 direction 不具有上述合法值之一
    • modelToView

      public abstract Shape  modelToView(int pos, Shape  a, Position.Bias  b) throws BadLocationException
      为给定字符提供从文档模型坐标空间到视图坐标空间的映射。
      参数:
      pos - 所需字符的位置 (>=0)
      a - 视图区域,包含请求的字符
      b - 偏移表示的前一个字符或下一个字符的偏差,以防该位置是两个视图的边界; b 将具有以下值之一:
      • Position.Bias.Forward
      • Position.Bias.Backward
      返回:
      指定位置字符在视图坐标空间中的边界框
      抛出:
      BadLocationException - 如果指定位置不代表关联文档中的有效位置
      IllegalArgumentException - 如果 b 不是上面列出的合法 Position.Bias 值之一
      参见:
    • modelToView

      public Shape  modelToView(int p0, Position.Bias  b0, int p1, Position.Bias  b1, Shape  a) throws BadLocationException
      为给定区域提供从文档模型坐标空间到视图坐标空间的映射。指定区域创建为第一个和最后一个字符位置的并集。
      参数:
      p0 - 第一个字符的位置 (>=0)
      b0 - 第一个字符位置的偏差,朝向偏移量表示的前一个字符或下一个字符,以防该位置是两个视图的边界; b0 将具有以下值之一:
      • Position.Bias.Forward
      • Position.Bias.Backward
      p1 - 最后一个字符的位置 (>=0)
      b1 - 第二个字符位置的偏差,定义了上面显示的合法值之一
      a - 包含请求区域的视图区域
      返回:
      边界框,它是第一个和最后一个字符位置指定的区域的并集
      抛出:
      BadLocationException - 如果给定位置不代表相关文档中的有效位置
      IllegalArgumentException - 如果 b0b1 不是上面列出的合法 Position.Bias 值之一
      参见:
    • viewToModel

      public abstract int viewToModel(float x, float y, Shape  a, Position.Bias [] biasReturn)
      提供从视图坐标空间到模型的逻辑坐标空间的映射。 biasReturn 参数将被填充以指示给定的点更接近模型中的下一个字符或模型中的前一个字符。
      参数:
      x - X 坐标 >= 0
      y - Y 坐标 >= 0
      a - 渲染的分配区域
      biasReturn - 返回的偏差
      返回:
      模型中最能代表视图中给定点的位置 >= 0。将填充 biasReturn 参数以指示给定点更接近模型中的下一个字符或模型中的前一个字符。
    • insertUpdate

      public void insertUpdate(DocumentEvent  e, Shape  a, ViewFactory  f)
      通知某些内容已插入文档中此视图负责的位置。为了减轻子类的负担,此功能被分散到子类可以重新实现的以下调用中:
      1. 如果此视图负责的元素发生任何更改,则调用 updateChildren 。如果这个视图有代表子元素的子视图,那么这个方法应该做任何必要的事情来确保子视图正确地代表模型。
      2. forwardUpdate 被调用以将 DocumentEvent 转发到适当的子视图。
      3. updateLayout 被调用是为了让视图有机会修复其布局、重新安排布局或什么都不做。
      参数:
      e - 来自关联文档的更改信息
      a - 视图的当前分配
      f - 如果视图有子视图,用于重建的工厂
      参见:
    • removeUpdate

      public void removeUpdate(DocumentEvent  e, Shape  a, ViewFactory  f)
      通知此视图负责的位置从文档中删除了某些内容。为了减轻子类的负担,此功能被分散到子类可以重新实现的以下调用中:
      1. 如果此视图负责的元素发生任何更改,则调用 updateChildren 。如果这个视图有代表子元素的子视图,那么这个方法应该做任何必要的事情来确保子视图正确地代表模型。
      2. forwardUpdate 被调用以将 DocumentEvent 转发到适当的子视图。
      3. updateLayout 被调用是为了让视图有机会修复其布局、重新安排布局或什么都不做。
      参数:
      e - 来自关联文档的更改信息
      a - 视图的当前分配
      f - 如果视图有子视图,用于重建的工厂
      参见:
    • changedUpdate

      public void changedUpdate(DocumentEvent  e, Shape  a, ViewFactory  f)
      从文档发出通知,通知该视图负责的位置的属性已更改。为了减轻子类的负担,此功能被分散到子类可以重新实现的以下调用中:
      1. 如果此视图负责的元素发生任何更改,则调用 updateChildren 。如果这个视图有代表子元素的子视图,那么这个方法应该做任何必要的事情来确保子视图正确地代表模型。
      2. forwardUpdate 被调用以将 DocumentEvent 转发到适当的子视图。
      3. updateLayout 被调用是为了让视图有机会修复其布局、重新安排布局或什么都不做。
      参数:
      e - 来自关联文档的更改信息
      a - 视图的当前分配
      f - 如果视图有子视图,用于重建的工厂
      参见:
    • getDocument

      public Document  getDocument()
      获取与视图关联的模型。
      返回:
      视图模型,null 如果没有
      参见:
    • getStartOffset

      public int getStartOffset()
      获取此视图负责的模型部分。
      返回:
      模型的起始偏移 >= 0
      参见:
    • getEndOffset

      public int getEndOffset()
      获取此视图负责的模型部分。
      返回:
      模型的结束偏移 >= 0
      参见:
    • getElement

      public Element  getElement()
      获取此视图映射到的主题的结构部分。视图可能不负责元素的整个部分。
      返回:
      主题
      参见:
    • getGraphics

      public Graphics  getGraphics()
      获取一个 Graphics 用于渲染。这可用于确定字体特征,打印视图与组件视图不同。
      返回:
      用于渲染的 Graphics 对象
      自从:
      1.3
    • getAttributes

      public AttributeSet  getAttributes()
      获取渲染时要使用的属性。默认情况下,这只是返回关联元素的属性。应该使用此方法而不是直接使用元素来获取对属性的访问权限,以允许混入特定于视图的属性或允许视图通过子类对特定于视图的属性进行转换。每个视图都应该记录它为渲染或布局目的识别的属性,并且应该始终通过此方法返回的 AttributeSet 访问它们。
      返回:
      渲染时使用的属性
    • breakView

      public View  breakView(int axis, int offset, float pos, float len)
      尝试在给定轴上打破此视图。这是由试图对其子项进行格式化的视图调用的。例如,一个段落的视图通常会尝试将其子元素放入行中,而代表文本块的视图有时会被分解成更小的部分。

      这是为了返回视图本身,它代表不可破坏的默认行为。如果视图确实支持中断,则返回的视图的起始偏移量应为给定的偏移量,结束偏移量应小于或等于被中断视图的结束偏移量。

      参数:
      axis - 可能是 View.X_AXISView.Y_AXIS
      offset - 文档模型中损坏的片段将占据的位置 >= 0。这将是返回的片段的起始偏移量
      pos - 破碎视图沿轴的位置 >= 0。这可能对选项卡计算等有用
      len - 指定沿轴的距离,其中需要潜在中断 >= 0
      返回:
      表示给定跨度的视图片段(如果视图可以断开)。如果视图不支持中断行为,则返回视图本身。
      参见:
    • createFragment

      public View  createFragment(int p0, int p1)
      创建表示元素一部分的视图。这在对视图片段进行测量的格式化操作期间可能很有用。如果视图不支持分段(默认),它应该返回自己。
      参数:
      p0 - 起始偏移量 >= 0。这应该是一个大于或等于元素起始偏移量且小于元素结束偏移量的值。
      p1 - 结束偏移量 > p0。这应该是一个小于或等于元素结束偏移量并大于元素开始偏移量的值。
      返回:
      视图片段,如果视图不支持分成片段,则它本身
      参见:
    • getBreakWeight

      public int getBreakWeight(int axis, float pos, float len)
      确定此视图中休息机会的吸引力。这可用于确定在格式化过程中哪个视图最有吸引力调用breakView。例如,表示其中包含空格的文本的视图可能比没有空格的视图更具吸引力。权重越高,突破越有吸引力。不应将等于或小于 BadBreakWeight 的值视为中断。大于或等于 ForcedBreakWeight 的值应该被打破。

      这是为了提供返回 BadBreakWeight 的默认行为,除非长度大于视图的长度,在这种情况下整个视图代表片段。除非已经编写了支持破坏行为的视图,否则尝试破坏视图是没有吸引力的。支持中断的视图示例是 LabelView 。使用断裂重量的视图示例是 ParagraphView

      参数:
      axis - 可能是 View.X_AXISView.Y_AXIS
      pos - 断开视图开始的潜在位置 >= 0。这可能对计算制表符位置有用
      len - 指定从 pos 开始的相对长度,其中需要潜在中断 >= 0
      返回:
      权重,应该是 ForcedBreakWeight 和 BadBreakWeight 之间的值
      参见:
    • getResizeWeight

      public int getResizeWeight(int axis)
      确定视图沿给定轴的可调整大小。 0 或更小的值不可调整大小。
      参数:
      axis - 可能是 View.X_AXISView.Y_AXIS
      返回:
      重量
    • setSize

      public void setSize(float width, float height)
      设置视图的大小。如果它有任何布局职责,这应该会导致视图沿给定轴布局。
      参数:
      width - 宽度 >= 0
      height - 高度 >= 0
    • getContainer

      public Container  getContainer()
      获取承载视图的容器。这对于安排重绘、查找主机组件字体等非常有用。默认实现是将查询转发到父视图。
      返回:
      容器,null 如果没有
    • getViewFactory

      public ViewFactory  getViewFactory()
      获取提供视图层次结构的 ViewFactory 实现。通常,当视图最有可能需要工厂时,会将其作为模型更新的参数,但此方法可在其他时间提供它。
      返回:
      工厂,null 如果没有
    • getToolTipText

      public String  getToolTipText(float x, float y, Shape  allocation)
      返回指定位置的工具提示文本。默认实现返回由传入位置标识的子视图的值。
      参数:
      x - x 坐标
      y - y 坐标
      allocation - 视图的当前分配。
      返回:
      指定位置的工具提示文本
      自从:
      1.4
      参见:
    • getViewIndex

      public int getViewIndex(float x, float y, Shape  allocation)
      返回表示视图中给定位置的子视图索引。这将迭代所有返回第一个边界包含 xy 的子项。
      参数:
      x - x 坐标
      y - y 坐标
      allocation - 视图的当前分配。
      返回:
      表示给定位置的视图的索引,如果没有视图表示该位置,则为 -1
      自从:
      1.4
    • updateChildren

      protected boolean updateChildren(DocumentEvent.ElementChange  ec, DocumentEvent  e, ViewFactory  f)
      更新子视图以响应收到模型更改的通知,并且该视图负责的元素有更改记录。这是为了假设子视图直接负责此视图表示的元素的子元素。 ViewFactory 用于为在 ElementChange 中添加的每个指定元素创建子视图,从给定 ElementChange 中指定的索引开始。代表被移除的指定元素的子视图数被移除。
      参数:
      ec - 此视图负责的元素的更改信息。如果调用此方法,则不应为 null
      e - 来自关联文档的更改信息
      f - 用于构建子视图的工厂
      返回:
      子视图是否表示该视图负责的元素的子元素。一些视图创建代表他们负责的元素的一部分的子级,并且应该返回 false。此信息用于确定是否应转发所添加元素范围内的视图
      自从:
      1.3
      参见:
    • forwardUpdate

      protected void forwardUpdate(DocumentEvent.ElementChange  ec, DocumentEvent  e, Shape  a, ViewFactory  f)
      将给定的 DocumentEvent 转发给需要通知模型更改的子视图。如果此视图负责的元素发生更改,则在转发时应考虑到这一点(即不应通知新的子视图)。
      参数:
      ec - 对此视图负责的元素的更改(如果没有更改,则可能是 null)。
      e - 来自关联文档的更改信息
      a - 视图的当前分配
      f - 如果视图有子视图,用于重建的工厂
      自从:
      1.3
      参见:
    • forwardUpdateToView

      protected void forwardUpdateToView(View  v, DocumentEvent  e, Shape  a, ViewFactory  f)
      DocumentEvent 转发给给子视图。这只是根据事件的类型通过调用 insertUpdateremoveUpdatechangedUpdate 向视图发送消息。这是由 forwardUpdate 调用的,用于将事件转发给需要它的孩子。
      参数:
      v - 将事件转发到的子视图
      e - 来自关联文档的更改信息
      a - 视图的当前分配
      f - 如果视图有子视图,用于重建的工厂
      自从:
      1.3
      参见:
    • updateLayout

      protected void updateLayout(DocumentEvent.ElementChange  ec, DocumentEvent  e, Shape  a)
      更新布局以响应从模型接收到的更改通知。如果 ElementChange 记录不是 null ,则执行此操作以调用 preferenceChanged 重新安排新布局。
      参数:
      ec - 对此视图负责的元素的更改(如果没有更改,则可能是 null
      e - 来自关联文档的更改信息
      a - 视图的当前分配
      自从:
      1.3
      参见:
    • modelToView

      @Deprecated public Shape  modelToView(int pos, Shape  a) throws BadLocationException
      已弃用。
      提供从文档模型坐标空间到映射到它的视图的坐标空间的映射。这是为了将偏差默认为 Position.Bias.Forward 而实现的,这是之前暗示的。
      参数:
      pos - 要转换的位置 >= 0
      a - 渲染的分配区域
      返回:
      返回给定位置的边界框
      抛出:
      BadLocationException - 如果给定位置不代表相关文档中的有效位置
      参见:
    • viewToModel

      @Deprecated public int viewToModel(float x, float y, Shape  a)
      已弃用。
      提供从视图坐标空间到模型的逻辑坐标空间的映射。
      参数:
      x - X 坐标 >= 0
      y - Y 坐标 >= 0
      a - 渲染的分配区域
      返回:
      模型中最能代表视图中给定点的位置 >= 0
      参见: