1 /* 2 * Copyright 2009, Oliver Tappe, zooey@hirschkaefer.de. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 7 #include <Application.h> 8 #include <Button.h> 9 #include <ControlLook.h> 10 #include <GroupLayout.h> 11 #include <GroupLayoutBuilder.h> 12 #include <ScrollView.h> 13 #include <String.h> 14 #include <TextControl.h> 15 #include <TextView.h> 16 #include <Window.h> 17 18 #include <stdio.h> 19 20 21 const static uint32 kMsgAlignLeft = 'alle'; 22 const static uint32 kMsgAlignCenter = 'alce'; 23 const static uint32 kMsgAlignRight = 'alri'; 24 25 26 class Window : public BWindow { 27 public: 28 Window(); 29 30 virtual bool QuitRequested(); 31 virtual void MessageReceived(BMessage *message); 32 33 private: 34 BTextControl* fTextControl; 35 BTextView* fTextView; 36 }; 37 38 39 // #pragma mark - 40 41 42 Window::Window() 43 : BWindow(BRect(100, 100, 800, 500), "TextView-Test", 44 B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS) 45 { 46 fTextControl = new BTextControl("text-contr-O", 47 "a single line of text - (c) Conglom-O", NULL); 48 49 BMessage storage; 50 fTextControl->Archive(&storage); 51 52 BTextControl* unarchived = new BTextControl(&storage); 53 54 BTextControl* disabled = new BTextControl("disabled", 55 "I'm disabled: you can't edit me", NULL); 56 disabled->SetEnabled(false); 57 BTextControl* invalid = new BTextControl("invalid", 58 "I'm invalid: my border is red", NULL); 59 invalid->MarkAsInvalid(true); 60 61 fTextView = new BTextView("text-O"); 62 BScrollView* scrollView = new BScrollView("scroll-O", fTextView, 0, true, 63 true, B_FANCY_BORDER); 64 65 SetLayout(new BGroupLayout(B_HORIZONTAL)); 66 AddChild(BGroupLayoutBuilder(B_VERTICAL, 10) 67 .Add(fTextControl) 68 .Add(unarchived) 69 .Add(disabled) 70 .Add(invalid) 71 .Add(scrollView) 72 .Add(BGroupLayoutBuilder(B_HORIZONTAL, 10) 73 .Add(new BButton("Align Left", new BMessage(kMsgAlignLeft))) 74 .AddGlue() 75 .Add(new BButton("Align Center", new BMessage(kMsgAlignCenter))) 76 .AddGlue() 77 .Add(new BButton("Align Right", new BMessage(kMsgAlignRight))) 78 ) 79 .SetInsets(5, 5, 5, 5) 80 ); 81 82 // generate some lines of content 83 const int32 kLineCount = 10; 84 const int32 kLineNoSize = 6; 85 BString line = ": just some text here - nothing special to see\n"; 86 BString format = BString("%*d") << line; 87 BString content; 88 int32 lineLength = line.Length() + kLineNoSize; 89 int32 contentLength = lineLength * kLineCount; 90 char* currLine = content.LockBuffer(contentLength); 91 if (currLine) { 92 int32 lineNo = 0; 93 for ( ; lineNo < kLineCount; currLine += lineLength) 94 sprintf(currLine, format.String(), kLineNoSize, lineNo++); 95 content.UnlockBuffer(contentLength); 96 } 97 fTextView->SetInsets(2,2,2,2); 98 fTextView->SetText(content.String()); 99 } 100 101 102 bool 103 Window::QuitRequested() 104 { 105 be_app->PostMessage(B_QUIT_REQUESTED); 106 return true; 107 } 108 109 110 void 111 Window::MessageReceived(BMessage *message) 112 { 113 switch (message->what) { 114 case kMsgAlignLeft: 115 fTextControl->SetAlignment(B_ALIGN_LEFT, B_ALIGN_LEFT); 116 fTextView->SetAlignment(B_ALIGN_LEFT); 117 break; 118 119 case kMsgAlignCenter: 120 fTextControl->SetAlignment(B_ALIGN_LEFT, B_ALIGN_CENTER); 121 fTextView->SetAlignment(B_ALIGN_CENTER); 122 break; 123 124 case kMsgAlignRight: 125 fTextControl->SetAlignment(B_ALIGN_LEFT, B_ALIGN_RIGHT); 126 fTextView->SetAlignment(B_ALIGN_RIGHT); 127 break; 128 129 default: 130 BWindow::MessageReceived(message); 131 break; 132 } 133 } 134 135 136 // #pragma mark - 137 138 139 class Application : public BApplication { 140 public: 141 Application(); 142 143 virtual void ReadyToRun(void); 144 }; 145 146 147 Application::Application() 148 : BApplication("application/x-vnd.haiku-test") 149 { 150 } 151 152 153 void 154 Application::ReadyToRun(void) 155 { 156 BWindow *window = new Window(); 157 window->Show(); 158 } 159 160 161 // #pragma mark - 162 163 164 int 165 main(int argc, char **argv) 166 { 167 Application app; 168 169 app.Run(); 170 return 0; 171 } 172 173