+ public void doMouseEnteredDefineMode(MouseEvent e)\r
+ {\r
+ if (scrollThread != null)\r
+ scrollThread.running = false;\r
+ }\r
+\r
+ public void doMouseExitedDefineMode(MouseEvent e)\r
+ {\r
+ if (av.getWrapAlignment())\r
+ return;\r
+\r
+ if(mouseDragging)\r
+ scrollThread = new ScrollThread();\r
+\r
+ }\r
+ // this class allows scrolling off the bottom of the visible alignment\r
+ class ScrollThread extends Thread\r
+ {\r
+ MouseEvent evt;\r
+ boolean running = false;\r
+ public ScrollThread()\r
+ {\r
+ start();\r
+ }\r
+\r
+ public void setEvent(MouseEvent e)\r
+ {\r
+ evt = e;\r
+ }\r
+\r
+ public void stopScrolling()\r
+ {\r
+ running = false;\r
+ }\r
+\r
+ public void run()\r
+ {\r
+ running = true;\r
+ while (running)\r
+ {\r
+ if(evt!=null)\r
+ {\r
+\r
+ if (mouseDragging && evt.getY() < 0 && av.getStartSeq() > 0)\r
+ running = ap.scrollUp(true);\r
+\r
+ if (mouseDragging && evt.getY() >= getHeight() &&\r
+ av.alignment.getHeight() > av.getEndSeq())\r
+ running = ap.scrollUp(false);\r
+\r
+ if (mouseDragging && evt.getX() < 0)\r
+ running = ap.scrollRight(true);\r
+\r
+ else if (mouseDragging && evt.getX() >= getWidth())\r
+ running = ap.scrollRight(false);\r
+ }\r
+\r
+ ap.repaint();\r
+ try\r
+ {\r
+ Thread.sleep(75);\r
+ }\r
+ catch (Exception ex)\r
+ {}\r
+ }\r
+ }\r
+}\r
+\r
+\r