src/Tools/jEdit/src/rich_text_area.scala
changeset 56322 f9ad26836516
parent 56321 7e8c11011fdf
child 56339 ce37fcb30cf2
equal deleted inserted replaced
56321:7e8c11011fdf 56322:f9ad26836516
     8 package isabelle.jedit
     8 package isabelle.jedit
     9 
     9 
    10 
    10 
    11 import isabelle._
    11 import isabelle._
    12 
    12 
    13 import java.awt.{Graphics2D, Shape, Color, Point, Toolkit, Cursor}
    13 import java.awt.{Graphics2D, Shape, Color, Point, Toolkit, Cursor, MouseInfo}
    14 import java.awt.event.{MouseMotionAdapter, MouseAdapter, MouseEvent,
    14 import java.awt.event.{MouseMotionAdapter, MouseAdapter, MouseEvent,
    15   FocusAdapter, FocusEvent, WindowEvent, WindowAdapter}
    15   FocusAdapter, FocusEvent, WindowEvent, WindowAdapter}
    16 import java.awt.font.TextAttribute
    16 import java.awt.font.TextAttribute
       
    17 import javax.swing.SwingUtilities
    17 import java.text.AttributedString
    18 import java.text.AttributedString
    18 import java.util.ArrayList
    19 import java.util.ArrayList
    19 
    20 
    20 import org.gjt.sp.util.Log
    21 import org.gjt.sp.util.Log
    21 import org.gjt.sp.jedit.{OperatingSystem, Debug, View}
    22 import org.gjt.sp.jedit.{OperatingSystem, Debug, View}
   177           case None =>
   178           case None =>
   178         }
   179         }
   179       }
   180       }
   180     }
   181     }
   181   }
   182   }
       
   183 
       
   184   private def mouse_inside_painter(): Boolean =
       
   185     MouseInfo.getPointerInfo match {
       
   186       case null => false
       
   187       case info =>
       
   188         val point = info.getLocation
       
   189         val painter = text_area.getPainter
       
   190         SwingUtilities.convertPointFromScreen(point, painter)
       
   191         painter.contains(point)
       
   192     }
   182 
   193 
   183   private val mouse_motion_listener = new MouseMotionAdapter {
   194   private val mouse_motion_listener = new MouseMotionAdapter {
   184     override def mouseDragged(evt: MouseEvent) {
   195     override def mouseDragged(evt: MouseEvent) {
   185       robust_body(()) {
   196       robust_body(()) {
   186         PIDE.dismissed_popups(view)
   197         PIDE.dismissed_popups(view)
   211         else active_reset()
   222         else active_reset()
   212 
   223 
   213         if (evt.getSource == text_area.getPainter) {
   224         if (evt.getSource == text_area.getPainter) {
   214           Pretty_Tooltip.invoke(() =>
   225           Pretty_Tooltip.invoke(() =>
   215             robust_body(()) {
   226             robust_body(()) {
   216               val rendering = get_rendering()
   227               if (mouse_inside_painter()) {
   217               val snapshot = rendering.snapshot
   228                 val rendering = get_rendering()
   218               if (!snapshot.is_outdated) {
   229                 val snapshot = rendering.snapshot
   219                 JEdit_Lib.pixel_range(text_area, x, y) match {
   230                 if (!snapshot.is_outdated) {
   220                   case None =>
   231                   JEdit_Lib.pixel_range(text_area, x, y) match {
   221                   case Some(range) =>
   232                     case None =>
   222                     val result =
   233                     case Some(range) =>
   223                       if (control) rendering.tooltip(range)
   234                       val result =
   224                       else rendering.tooltip_message(range)
   235                         if (control) rendering.tooltip(range)
   225                     result match {
   236                         else rendering.tooltip_message(range)
   226                       case None =>
   237                       result match {
   227                       case Some(tip) =>
   238                         case None =>
   228                         val painter = text_area.getPainter
   239                         case Some(tip) =>
   229                         val loc = new Point(x, y + painter.getFontMetrics.getHeight / 2)
   240                           val painter = text_area.getPainter
   230                         val results = rendering.command_results(range)
   241                           val loc = new Point(x, y + painter.getFontMetrics.getHeight / 2)
   231                         Pretty_Tooltip(view, painter, loc, rendering, results, tip)
   242                           val results = rendering.command_results(range)
   232                     }
   243                           Pretty_Tooltip(view, painter, loc, rendering, results, tip)
       
   244                       }
       
   245                   }
   233                 }
   246                 }
   234               }
   247               }
   235           })
   248           })
   236         }
   249         }
   237       }
   250       }