src/Tools/jEdit/src/completion_popup.scala
changeset 56197 416f7a00e4cb
parent 56177 bfa9dfb722de
child 56325 ffbfc92e6508
equal deleted inserted replaced
56187:2666cd7d380c 56197:416f7a00e4cb
   110 
   110 
   111     def active_range: Option[Text.Range] =
   111     def active_range: Option[Text.Range] =
   112       completion_popup match {
   112       completion_popup match {
   113         case Some(completion) =>
   113         case Some(completion) =>
   114           completion.active_range match {
   114           completion.active_range match {
   115             case Some((range, _)) if completion.isDisplayable => Some(range)
   115             case Some(range) if completion.isDisplayable => Some(range)
   116             case _ => None
   116             case _ => None
   117           }
   117           }
   118         case None => None
   118         case None => None
   119       }
   119       }
   120 
   120 
   234             SwingUtilities.convertPoint(painter,
   234             SwingUtilities.convertPoint(painter,
   235               loc1.x, loc1.y + painter.getFontMetrics.getHeight, layered)
   235               loc1.x, loc1.y + painter.getFontMetrics.getHeight, layered)
   236 
   236 
   237           val items = result.items.map(new Item(_))
   237           val items = result.items.map(new Item(_))
   238           val completion =
   238           val completion =
   239             new Completion_Popup(Some((range, invalidate _)), layered, loc2, font, items)
   239             new Completion_Popup(Some(range), layered, loc2, font, items)
   240             {
   240             {
   241               override def complete(item: Completion.Item) {
   241               override def complete(item: Completion.Item) {
   242                 PIDE.completion_history.update(item)
   242                 PIDE.completion_history.update(item)
   243                 insert(item)
   243                 insert(item)
   244               }
   244               }
   245               override def propagate(evt: KeyEvent) {
   245               override def propagate(evt: KeyEvent) {
   246                 JEdit_Lib.propagate_key(view, evt)
   246                 if (view.getKeyEventInterceptor == inner_key_listener) {
       
   247                   try {
       
   248                     view.setKeyEventInterceptor(null)
       
   249                     JEdit_Lib.propagate_key(view, evt)
       
   250                   }
       
   251                   finally {
       
   252                     if (isDisplayable) view.setKeyEventInterceptor(inner_key_listener)
       
   253                   }
       
   254                 }
   247                 if (evt.getID == KeyEvent.KEY_TYPED) input(evt)
   255                 if (evt.getID == KeyEvent.KEY_TYPED) input(evt)
   248               }
   256               }
   249               override def refocus() { text_area.requestFocus }
   257               override def shutdown(focus: Boolean) {
       
   258                 if (view.getKeyEventInterceptor == inner_key_listener)
       
   259                   view.setKeyEventInterceptor(null)
       
   260                 if (focus) text_area.requestFocus
       
   261                 invalidate()
       
   262               }
   250             }
   263             }
   251           completion_popup = Some(completion)
   264           completion_popup = Some(completion)
       
   265           view.setKeyEventInterceptor(completion.inner_key_listener)
   252           invalidate()
   266           invalidate()
   253           completion.show_popup()
   267           completion.show_popup(false)
   254         }
   268         }
   255       }
   269       }
   256 
   270 
   257       if (buffer.isEditable) {
   271       if (buffer.isEditable) {
   258         val (no_completion, semantic_completion, opt_rendering) =
   272         val (no_completion, semantic_completion, opt_rendering) =
   446                     insert(item)
   460                     insert(item)
   447                   }
   461                   }
   448                   override def propagate(evt: KeyEvent) {
   462                   override def propagate(evt: KeyEvent) {
   449                     if (!evt.isConsumed) text_field.processKeyEvent(evt)
   463                     if (!evt.isConsumed) text_field.processKeyEvent(evt)
   450                   }
   464                   }
   451                   override def refocus() { text_field.requestFocus }
   465                   override def shutdown(focus: Boolean) { if (focus) text_field.requestFocus }
   452                 }
   466                 }
   453               completion_popup = Some(completion)
   467               completion_popup = Some(completion)
   454               completion.show_popup()
   468               completion.show_popup(true)
   455 
   469 
   456             case None =>
   470             case None =>
   457           }
   471           }
   458         case _ =>
   472         case _ =>
   459       }
   473       }
   504   }
   518   }
   505 }
   519 }
   506 
   520 
   507 
   521 
   508 class Completion_Popup private(
   522 class Completion_Popup private(
   509   val active_range: Option[(Text.Range, () => Unit)],
   523   val active_range: Option[Text.Range],
   510   layered: JLayeredPane,
   524   layered: JLayeredPane,
   511   location: Point,
   525   location: Point,
   512   font: Font,
   526   font: Font,
   513   items: List[Completion_Popup.Item]) extends JPanel(new BorderLayout)
   527   items: List[Completion_Popup.Item]) extends JPanel(new BorderLayout)
   514 {
   528 {
   522 
   536 
   523   /* actions */
   537   /* actions */
   524 
   538 
   525   def complete(item: Completion.Item) { }
   539   def complete(item: Completion.Item) { }
   526   def propagate(evt: KeyEvent) { }
   540   def propagate(evt: KeyEvent) { }
   527   def refocus() { }
   541   def shutdown(focus: Boolean) { }
   528 
   542 
   529 
   543 
   530   /* list view */
   544   /* list view */
   531 
   545 
   532   private val list_view = new ListView(items)
   546   private val list_view = new ListView(items)
   566   }
   580   }
   567 
   581 
   568 
   582 
   569   /* event handling */
   583   /* event handling */
   570 
   584 
   571   private val inner_key_listener =
   585   val inner_key_listener =
   572     JEdit_Lib.key_listener(
   586     JEdit_Lib.key_listener(
   573       key_pressed = (e: KeyEvent) =>
   587       key_pressed = (e: KeyEvent) =>
   574         {
   588         {
   575           if (!e.isConsumed) {
   589           if (!e.isConsumed) {
   576             e.getKeyCode match {
   590             e.getKeyCode match {
   637       new Dimension(w, h)
   651       new Dimension(w, h)
   638     }
   652     }
   639     new Popup(layered, completion, screen.relative(layered, size), size)
   653     new Popup(layered, completion, screen.relative(layered, size), size)
   640   }
   654   }
   641 
   655 
   642   private def show_popup()
   656   private def show_popup(focus: Boolean)
   643   {
   657   {
   644     popup.show
   658     popup.show
   645     list_view.requestFocus
   659     if (focus) list_view.requestFocus
   646   }
   660   }
   647 
       
   648   private val hide_popup_delay =
       
   649     Swing_Thread.delay_last(PIDE.options.seconds("jedit_completion_dismiss_delay")) {
       
   650       active_range match { case Some((_, invalidate)) => invalidate() case _ => }
       
   651       popup.hide
       
   652     }
       
   653 
   661 
   654   private def hide_popup()
   662   private def hide_popup()
   655   {
   663   {
   656     if (list_view.peer.isFocusOwner) refocus()
   664     shutdown(list_view.peer.isFocusOwner)
   657 
   665     popup.hide
   658     if (PIDE.options.seconds("jedit_completion_dismiss_delay").is_zero) {
       
   659       active_range match { case Some((_, invalidate)) => invalidate() case _ => }
       
   660       popup.hide
       
   661     }
       
   662     else hide_popup_delay.invoke()
       
   663   }
   666   }
   664 }
   667 }
   665 
   668