1/* 2** Copyright 2004, Axel Dörfler, axeld@pinc-software.de. All rights reserved. 3** Distributed under the terms of the OpenBeOS License. 4*/ 5 6 7#include <ScrollView.h> 8 9#include <Application.h> 10#include <Window.h> 11#include <Box.h> 12 13#include <stdio.h> 14 15 16//#define ARCHIVE_TEST 17//#define CHANGE_BORDER_TEST 18//#define SIZE_TEST 19 20uint32 gNumWindows = 0; 21 22 23class Window : public BWindow { 24 public: 25 Window(); 26 27 virtual bool QuitRequested(); 28}; 29 30 31Window::Window() 32 : BWindow(BRect(100, 100, 580, 580), "Scroll-Test", 33 B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS) 34{ 35 const bool horiz[] = {false, true, false, true}; 36 const bool vert[] = {false, false, true, true}; 37 const border_style border[] = {B_NO_BORDER, B_PLAIN_BORDER, B_FANCY_BORDER, B_FANCY_BORDER}; 38 BRect rect(1, 1, 119, 119); 39 BRect frame = rect.InsetByCopy(20, 20); 40 41 for (int32 i = 0; i < 16; i++) { 42 if (i > 0 && (i % 4) == 0) 43 rect.OffsetBy(-480, 120); 44 45 int32 resizingMode = B_FOLLOW_LEFT | B_FOLLOW_TOP; 46 if (i % 4 == 3) { 47 if (i == 15) 48 resizingMode = B_FOLLOW_ALL; 49 else 50 resizingMode = B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP; 51 } else if (i > 11) 52 resizingMode = B_FOLLOW_TOP_BOTTOM | B_FOLLOW_LEFT; 53 54 BBox *box = new BBox(rect, "box", resizingMode); 55 AddChild(box); 56 57 BView *view = new BView(frame, "main view", B_FOLLOW_ALL, B_WILL_DRAW); 58 view->SetViewColor(200, 200, 21); 59 BView *inner = new BView(frame.OffsetToCopy(B_ORIGIN).InsetBySelf(3, 3), 60 "inner", B_FOLLOW_ALL, B_WILL_DRAW); 61 inner->SetViewColor(200, 42, 42); 62 view->AddChild(inner); 63 64 BScrollView *scroller = new BScrollView("scroller", view, resizingMode, 65 0, horiz[i % 4], vert[i % 4], border[i / 4]); 66 if (i >= 12) 67 scroller->SetBorderHighlighted(true); 68 box->AddChild(scroller); 69 70#ifdef ARCHIVE_TEST 71 if (i == 7) { 72 BMessage archive; 73 if (scroller->Archive(&archive/*, false*/) == B_OK) { 74 puts("BScrollView archived:"); 75 archive.PrintToStream(); 76 } else 77 puts("archiving failed!"); 78 79 BScrollView *second = (BScrollView *)BScrollView::Instantiate(&archive); 80 archive.MakeEmpty(); 81 if (second != NULL && second->Archive(&archive) == B_OK) { 82 puts("2. BScrollView archived:"); 83 archive.PrintToStream(); 84 } 85 } 86#endif 87 88#ifdef CHANGE_BORDER_TEST 89 if (i % 4 == 1) 90 scroller->SetBorder(B_FANCY_BORDER); 91 else if (i % 4 == 2) 92 scroller->SetBorder(B_PLAIN_BORDER); 93 else if (i % 4 == 3) 94 scroller->SetBorder(B_NO_BORDER); 95#endif 96 97 rect.OffsetBy(120, 0); 98 } 99 100#ifdef SIZE_TEST 101 printf("sizeof = %lu (R5 == 212)\n", sizeof(BScrollView)); 102#endif 103 104 gNumWindows++; 105} 106 107 108bool 109Window::QuitRequested() 110{ 111 if (--gNumWindows <= 0) 112 be_app->PostMessage(B_QUIT_REQUESTED); 113 return true; 114} 115 116 117// #pragma mark - 118 119 120class KnobWindow : public BWindow { 121 public: 122 KnobWindow(bool horiz, bool vert); 123 124 virtual bool QuitRequested(); 125}; 126 127 128KnobWindow::KnobWindow(bool horiz, bool vert) 129 : BWindow(BRect(200, 200, 400, 400), "Scroll Knob", 130 B_DOCUMENT_WINDOW, B_ASYNCHRONOUS_CONTROLS) 131{ 132 BRect frame = Bounds(); 133 134 if (horiz) { 135 MoveBy(50, 50); 136 frame.bottom -= B_H_SCROLL_BAR_HEIGHT; 137 } 138 if (vert) { 139 MoveBy(100, 100); 140 frame.right -= B_V_SCROLL_BAR_WIDTH; 141 } 142 143 BView *view = new BView(frame, "main view", B_FOLLOW_ALL, B_WILL_DRAW); 144 BScrollView *scroller = new BScrollView("scroller", view, B_FOLLOW_ALL, 0, horiz, vert); 145 AddChild(scroller); 146 147 // check the SetTarget() functionality 148 149 BView *outer = new BView(frame, "main view", B_FOLLOW_ALL, B_WILL_DRAW); 150 outer->SetViewColor(200, 200, 21); 151 BView *inner = new BView(frame.OffsetToCopy(B_ORIGIN).InsetBySelf(3, 3), 152 "inner", B_FOLLOW_ALL, B_WILL_DRAW); 153 inner->SetViewColor(200, 42, 42); 154 outer->AddChild(inner); 155 156 scroller->RemoveChild(view); 157 // works with and without it 158 159 scroller->SetTarget(NULL); 160 scroller->SetTarget(outer); 161 delete view; 162 163 gNumWindows++; 164} 165 166 167bool 168KnobWindow::QuitRequested() 169{ 170 if (--gNumWindows <= 0) 171 be_app->PostMessage(B_QUIT_REQUESTED); 172 return true; 173} 174 175 176// #pragma mark - 177 178 179class Application : public BApplication { 180 public: 181 Application(); 182 183 virtual void ReadyToRun(void); 184}; 185 186 187Application::Application() 188 : BApplication("application/x-vnd.obos-test") 189{ 190} 191 192 193void 194Application::ReadyToRun(void) 195{ 196 BWindow *window = new Window(); 197 window->Show(); 198 199 window = new KnobWindow(true, false); 200 window->Show(); 201 202 window = new KnobWindow(false, true); 203 window->Show(); 204 205 window = new KnobWindow(true, true); 206 window->Show(); 207} 208 209 210// #pragma mark - 211 212 213int 214main(int argc, char **argv) 215{ 216 Application app; 217 218 app.Run(); 219 return 0; 220} 221 222