[comp.windows.interviews] Viewports and scrolling .....

david@UUNET.UU.NET (05/06/91)

	
	This is an InterViews 2.6 question.

	O.K. I give up.  What I want to be able to do is to insert an arbitrary
Interactor into something that will allow me to view a specified (smaller)
portion of said interactor.  I would also like to be ablt to attach ScrollBars
to this thing.  I would expect the ScrollBars to configure themselves so that
I can view all of the interactor.  I had thought I was going to be able get this
behaviour out of a Viewport, but on futher inspection realized that there wasn't
a way to specify the "initial size" of the viewport; it defaults to the size of
the inserted interactor.   Then I stumbled onto Trays and thought aha! this will
do it, only to find out that the scrollbar refused to behave.  Below is an
example of the Tray/Viewport version.  The only problem with this is that the
ScrollBar thinks (reasonably) that there's no more resizing to be done. 
Actually I can move around a bit by using the Up/Down Movers.  This doesn't work
well, nor in a particularlly inteligent way, so I gotta believe I'm just not
doing the right thing.

	Any help would be apreciated.  


	.
	.
	.

	// Something to scroll around.
	VBox *listBox = new VBox;
	listBox->Insert( Message( "The first one"));
	listBox->Insert( Message( "The second one"));
		.
		.
		.
	listBox->Insert( Message( "The n'th one"));

        // Use a viewport here to give something for the scrollbar to talk to.
	Viewport *theViewer = new Viewport( listBox, TopLeft);

	// Make a tray with a background the "right size" and 
	// stick theViewer into it.
	VBox *theSize = new VBox( 
		new VGlue( (Coord)round( .5*inches), 0, 0),
		new HBox( new HGlue( (Coord)round( 2.5*inches, 0, 0)
	);
	Tray *aTray = new Tray( theSize);
	aTray->Aligh( TopLeft, theViewer);

	// Build a Frame suitable for putting into the world
	// with the above and include a scrollbar for theViewer.
	MarginFrame *whatWeSee = new MarginFrame(
		new HBox(
			aTray,
			new VScrollBar( theViewer)
		),
		(Coord) round( .5*inches)
	);
	.
	.
	.


	Thanks alot,


	David


Daivd Rivas						david@lolita.ntlp.com
Northfield Trading L. P.				(303) 985-3366

linton@marktwain.rad.sgi.com (Mark Linton) (05/08/91)

In article <9105061618.AA04456@ntlp.com>, lolita!david@UUNET.UU.NET writes:
|> 
|> 	
|> 	This is an InterViews 2.6 question.
|> 
|> 	O.K. I give up.  What I want to be able to do is to insert an arbitrary
|> Interactor into something that will allow me to view a specified (smaller)
|> portion of said interactor.  I would also like to be ablt to attach ScrollBars
|> to this thing.  I would expect the ScrollBars to configure themselves so that
|> I can view all of the interactor.  I had thought I was going to be able get this
|> behaviour out of a Viewport, but on futher inspection realized that there wasn't
|> a way to specify the "initial size" of the viewport; it defaults to the size of
|> the inserted interactor.   Then I stumbled onto Trays and thought aha! this will
|> do it, only to find out that the scrollbar refused to behave.  Below is an
|> example of the Tray/Viewport version.  The only problem with this is that the
|> ScrollBar thinks (reasonably) that there's no more resizing to be done. 
|> Actually I can move around a bit by using the Up/Down Movers.  This doesn't work
|> well, nor in a particularlly inteligent way, so I gotta believe I'm just not
|> doing the right thing.

Trays don't constrain the size of their components, so putting the box in the tray
doesn't help.  What you want is a Viewport or MonoScene subclass with a specific
shape.  3.0 provides FixedSpan for glyphs; you want the analogous interactor.
Below is your test case with a Shaper class that does what you want (I think).

#include <InterViews/box.h>
#include <InterViews/frame.h>
#include <InterViews/glue.h>
#include <InterViews/message.h>
#include <InterViews/scrollbar.h>
#include <InterViews/viewport.h>
#include <InterViews/world.h>

class Shaper : public MonoScene {
public:
    Shaper(Interactor*, Shape&);
protected:
    virtual void Reconfig();
};

Shaper::Shaper(Interactor* i, Shape& s) {
    *shape = s;
    Insert(i);
}

void Shaper::Reconfig() {
    /* don't copy child's shape */
}

int main(int argc, char** argv) {
    World w("Test", argc, argv);

    VBox* listBox = new VBox;
    listBox->Insert(new Message("The first one"));
    listBox->Insert(new Message("The second one"));
    listBox->Insert(new Message("The third one"));
    listBox->Insert(new Message("The fourth one"));
    listBox->Insert(new Message("The fifth one"));
    listBox->Insert(new Message("The sixth one"));
    listBox->Insert(new Message("The seventh one"));
    listBox->Insert(new Message("The eighth one"));
    listBox->Insert(new Message("The last one"));

    Viewport* theViewer = new Viewport(listBox, TopLeft);
    Shape s;
    s.Rect(round(2.5*inches), round(.5*inches));
    w.Insert(
	new HBox(
	    new Shaper(theViewer, s),
	    new VScrollBar(theViewer)
	)
    );
    w.run();
}