Project

General

Profile

evl_upd20151125c.diff

Reworked auto-scroll - Eugenie Lyzenko, 11/25/2015 06:06 PM

Download (8.59 KB)

View differences:

src/com/goldencode/p2j/ui/client/gui/ComboBoxGuiImpl.java 2015-11-24 23:01:14 +0000
48 48
**                  GUI mode ignoring SESSION:DATA-ENTRY-RETURN value.  The combo-box does not
49 49
**                  react to the ENTER key in GUI.  Key processsing fixes for GUI mode.
50 50
** 014 EVL 20151120 Fix for drop-down line spacing issue. And fix for button incorrect drawing
51
**                  over 3d border.
51
**                  over 3d border.  Drop-down button fix for pressed state drawing.  Pressing
52
**                  the drop-down button need to be painted accordingly.
52 53
*/
53 54

  
54 55
package com.goldencode.p2j.ui.client.gui;
......
396 397
      {
397 398
         requestFocus();
398 399
         pressed = true;
400

  
399 401
         // drop-down is opening on mouse press
400 402
         if (config.mode != ComboBoxConfig.Mode.SIMPLE)
401 403
         {
404
            // first need to display the button pressing effect 
405
            ThinClient.getInstance().independentEventDrawingBracket(this, new Runnable()
406
            {
407
               public void run()
408
               {
409
                  repaint();
410
               }
411
            });
412

  
413
            // depending on current state activate or dismiss drop-down 
402 414
            if (dropDownActive)
403 415
            {
404 416
               // second click to drop-down button or area dismisses the active drop-down
src/com/goldencode/p2j/ui/client/gui/ScrollBarGuiButton.java 2015-11-25 22:59:03 +0000
24 24
** 010 EVL 20151010 Fix for thumb drawing issues. Also reworked image loader specifically for
25 25
**                  small images.  Optimization for button painting on mouse press, release.  In
26 26
**                  these cases we do not need to repaint whole window.
27
** 011 EVL 20151124 The button pressed state needs repaint() call to properly display pressed mode
28
**                  when running indide drop-down life cycle.  Improved mouse handling, in 4GL
29
**                  if to press mouse, move inside button and release - this generates click.  So
30
**                  we have to track the mouse release, not click.  Adding auto-scroll feature on
31
**                  press and hold mouse button.  The mouse executor shoule be stopped on widget
32
**                  destroy to free the resources.  Changing static executor to be instance based.
27 33
*/
28 34

  
29 35
package com.goldencode.p2j.ui.client.gui;
......
31 37
// this usage of AWT events is intentional, they are being used separately from the
32 38
// AWT/Swing event model itself; no other AWT/Swing usage is occurring in this class
33 39
import java.awt.event.MouseEvent;
40
import java.util.concurrent.*;
34 41

  
35 42
import com.goldencode.p2j.ui.*;
36 43
import com.goldencode.p2j.ui.chui.ThinClient;
37 44
import com.goldencode.p2j.ui.client.*;
45
import com.goldencode.p2j.ui.client.event.*;
38 46
import com.goldencode.p2j.ui.client.ScrollBar.Orientation;
39 47
import com.goldencode.p2j.ui.client.ScrollBar.Position;
40 48
import com.goldencode.p2j.ui.client.gui.driver.*;
......
65 73
   private ImageWrapper<?> img_d;
66 74
   
67 75
   /** Button state */
68
   boolean up = true;
76
   private volatile boolean up = true;
69 77
      
78
   /** Executor for handling mouse input. */
79
   private ExecutorService mouseInputExecutor = Executors.newSingleThreadExecutor();
80
   
70 81
   /**
71 82
    * This constructor creates a scroll bar button.
72 83
    * 
......
198 209
   }
199 210

  
200 211
   /**
201
    * Notification of a mouse clicked event occurred for this widget.
202
    * 
203
    * @param    e
204
    *           The mouse event.
205
    */   
206
   @Override
207
   public void mouseClicked(MouseEvent e)
208
   {
209
      // check if the scrollbar widget is enabled
210
      if (owner.isEnabled())
211
      {
212
         // call scroll bar
213
         owner.onButtonClick(position, false);
214
      }
215
   }
216

  
217
   /**
218 212
    * Notification of a mouse pressed event occurred for this widget.
219 213
    * 
220 214
    * @param    e
......
227 221
      if (owner.isEnabled())
228 222
      {
229 223
         up = false;
230
         refresh();
224
         // need to use repaint() here instead of refresh() because for example inside combo-box
225
         // drop-down standalone event loop the screen synchronization is not happening
226
         repaint();
227

  
228
         // for holding mouse we need to genereate scroll events
229
         mouseInputExecutor.execute(new Runnable()
230
         {
231

  
232
            @Override
233
            public void run()
234
            {
235
               // finisho on mouse release
236
               while (!up)
237
               {
238
                  try
239
                  {
240
                     // wait to see if the mouse is still pressed
241
                     Thread.sleep(GuiConstants.REPEAT_MILLIS);
242

  
243
                     if (!up)
244
                     {
245
                        // emit the sequential scroll events
246
                        ThinClient.getInstance().eventDrawingBracket(owner, new Runnable()
247
                        {
248
                           public void run()
249
                           {
250
                              // emit new scroll event
251
                              ScrollEvent evt =
252
                                 ((ScrollBarGuiImpl)owner).createAutoScrollEvent(position);
253
                           
254
                              EventManager.postEvent(evt);
255
                           }
256
                        });
257
                     }
258
                  }
259
                  catch (InterruptedException ex)
260
                  {
261
                     // nop
262
                  }
263
               }
264
            }
265
         });
231 266
      }         
232 267
   }
233 268

  
......
244 279
      if (owner.isEnabled())
245 280
      {
246 281
         up = true;
247
         refresh();
282
         repaint();
283
         // call scroll bar
284
         owner.onButtonClick(position, false);
248 285
      }         
249 286
   }
250 287
   
251 288
   /**
289
    * Destroy this widget.  Cleans up all including widgets before destruction.
290
    */
291
   @Override
292
   public void destroy()
293
   {
294
      // stop the mouse related thread if it is active
295
      if (!mouseInputExecutor.isShutdown())
296
      {
297
         mouseInputExecutor.shutdownNow();
298
      }
299

  
300
      // call superclass for main destruction
301
      super.destroy();
302
   }
303
   
304
   /**
252 305
    * Refresh the scrollbar button not repainting full window.
253 306
    */
254 307
   @Override
src/com/goldencode/p2j/ui/client/gui/ScrollBarGuiImpl.java 2015-11-25 23:00:40 +0000
38 38
** 018 SVL 20151029 Added support for scroll bar controllers.
39 39
**     EVL 20151111 Fix for scrollbar thumb size calculation. The minimum size is 8.  When nothing
40 40
**                  to scroll - it is not required to draw the thumb.  Fix for background drawing.
41
** 019 EVL 20151125 Adding executor shutdown to prevent resource leak.  Changing static executor
42
**                  to be instance based.
41 43
*/
42 44

  
43 45
package com.goldencode.p2j.ui.client.gui;
......
73 75
   public static final int SCROLLBAR_SIZE = 16;
74 76
   
75 77
   /** Executor for handling mouse input. */
76
   private static ExecutorService mouseInputExecutor = Executors.newSingleThreadExecutor();
78
   private ExecutorService mouseInputExecutor = Executors.newSingleThreadExecutor();
77 79

  
78 80
   /** Screen driver */
79 81
   private GuiDriver gd;
......
730 732
   }
731 733

  
732 734
   /**
735
    * Destroy this widget.  Cleans up all including widgets before destruction.
736
    */
737
   @Override
738
   public void destroy()
739
   {
740
      // stop the mouse related thread if it is active
741
      if (!mouseInputExecutor.isShutdown())
742
      {
743
         mouseInputExecutor.shutdownNow();
744
      }
745

  
746
      // call superclass for main destruction
747
      super.destroy();
748
   }
749
   
750
   /**
751
    * Create GUI specific auto-scroll event.
752
    * 
753
    * @param   btn
754
    *          The source button that caused the event.
755
    */
756
   public ScrollEvent createAutoScrollEvent(Position btn)
757
   {
758
      // start with the current position
759
      int newPos = position;
760
                        
761
      if (btn == ScrollBar.Position.RIGHT)
762
      {
763
         newPos += shortStep;
764
      }
765
      else
766
      {
767
         newPos -= shortStep;
768
      }
769
      
770
      return createScrollEvent(newPos);
771
   }
772

  
773
   /**
733 774
    * Get size of the travel area available for thumb scrolling.
734 775
    *
735 776
    * @return size of travel area, in pixels.