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