## SwingOSC – Java-based GUI classes

last mod: 31-jul-07 sciss

# JSCScrollBar

Note: please use the abstraction layer GUI.scrollBar if possible! (see GUI). See also JSCView.

A kind of range slider that is commonly used to specify the viewport into a virtual scrollable canvas. See also JSCScrollPane for a combination of scroll bars with a container viewport.

    (
        w = JSCWindow( "ScrollBars", Rect( 360, 240, 400, 400 ));
        v = JSCScrollBar( w, Rect( 380, 4, 16, 372 ))
            .resize_( 6 )
            .extent_( 0.1 ) // 1/10th of the virtual viewport extent
            .action_({ w.refresh });
        h = JSCScrollBar( w, Rect( 4, 380, 372, 16 ))
            .resize_( 8 )
            .extent_( 0.1 ) // 1/10th of the virtual viewport extent
            .action_({ w.refresh });
        JSCUserView( w, Rect( 4, 4, 372, 372 ))
            .resize_( 5 )
            .background_( Color.black )
            .canFocus_( false )
            .drawFunc_({ arg view;
                var b = view.bounds;
                JPen.addRect( b );
                JPen.clip;
                JPen.translate( b.left, b.top );
                JPen.scale( b.width / (10 * h.extent), b.height / (10 * v.extent) );
                JPen.translate( h.value * -10, v.value * -10 );
                JPen.font = JFont( "Monospaced", 2 );
                5.do({ arg y;
                    JPen.fillColor = Color.hsv( y / 5, 1, 1 );
                    JPen.stringAtPoint( "VIEWPORT", 0.1 @ ((y << 1) - 0.5) );
                });
            });
        w.front;
    )

    // assign a function that is called when button toggles:
    // value returns float between 0 and 1. isAdjusting
    // returns true when the slider is currently being dragged,
    // false if the mouse button is released or the slider
    // is positioned programmatically using valueAction_
    v.action = { arg butt; ("New value = " ++ butt.value ++ "; isAdjusting? " ++ butt.isAdjusting ).postln; w.refresh };

    // set value (without invoking action function).
    // the valid range is 0 ... (1 - extent). values outside
    // this range will be clipped automatically
    v.value = 0.2;
    v.value = 0.6;
    v.value = 1.0;	// clips to 0.9 when extent is 0.1!

    // set state and invoke action function if it results in a change of value
    v.valueAction = 0.5;

    // set the extent, i.e. visible amount of the viewport (default is 1.0)
    v.extent = 0.2; w.refresh;
    h.extent = 0.4; v.extent = 0.4; w.refresh;
    h.extent = 1.0; v.extent = 1.0; w.refresh;

    // set both value and extent by specifying a span from 'lo' to 'hi'
    h.setSpan( 0.2, 0.4 );
    h.setSpanActive( 0.4, 0.6 );	// invokes action function

    // the unit increment is a factor of the extent
    // by which the scrollbar moves when clicking into the arrows.
    // the default is 0.1 (1/10th of the scrollbar extent)
    h.unitIncrement = 0.01;  // very fine
    h.unitIncrement = 0.5;   // very coarse

    // the block increment is a factor of the extent
    // by which the scrollbar moves when clicking next to
    // the handle into the track.
    // the default is 1.0 (jump one full scrollbar extent)

    h.blockIncrement = 0.1;  // fine
    h.blockIncrement = 2.0;  // coarse