1*a325aa03SAugustin Cavalier /* ----------------------------------------------------------------------- 2*a325aa03SAugustin Cavalier * Copyright (c) 2004 Waldemar Kornewald, Waldemar.Kornewald@web.de 3*a325aa03SAugustin Cavalier * 4*a325aa03SAugustin Cavalier * Permission is hereby granted, free of charge, to any person obtaining a 5*a325aa03SAugustin Cavalier * copy of this software and associated documentation files (the "Software"), 6*a325aa03SAugustin Cavalier * to deal in the Software without restriction, including without limitation 7*a325aa03SAugustin Cavalier * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8*a325aa03SAugustin Cavalier * and/or sell copies of the Software, and to permit persons to whom the 9*a325aa03SAugustin Cavalier * Software is furnished to do so, subject to the following conditions: 10*a325aa03SAugustin Cavalier * 11*a325aa03SAugustin Cavalier * The above copyright notice and this permission notice shall be included in 12*a325aa03SAugustin Cavalier * all copies or substantial portions of the Software. 13*a325aa03SAugustin Cavalier * 14*a325aa03SAugustin Cavalier * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15*a325aa03SAugustin Cavalier * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16*a325aa03SAugustin Cavalier * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17*a325aa03SAugustin Cavalier * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18*a325aa03SAugustin Cavalier * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 19*a325aa03SAugustin Cavalier * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 20*a325aa03SAugustin Cavalier * DEALINGS IN THE SOFTWARE. 21*a325aa03SAugustin Cavalier * ----------------------------------------------------------------------- */ 22*a325aa03SAugustin Cavalier 23*a325aa03SAugustin Cavalier #include "TextRequestDialog.h" 24*a325aa03SAugustin Cavalier #include "InterfaceUtils.h" 25*a325aa03SAugustin Cavalier 26*a325aa03SAugustin Cavalier #include <Button.h> 27*a325aa03SAugustin Cavalier #include <TextControl.h> 28*a325aa03SAugustin Cavalier #include <TextView.h> 29*a325aa03SAugustin Cavalier 30*a325aa03SAugustin Cavalier 31*a325aa03SAugustin Cavalier // GUI constants 32*a325aa03SAugustin Cavalier static const uint32 kWindowWidth = 250; 33*a325aa03SAugustin Cavalier static const uint32 kWindowHeight = 10 + 20 + 10 + 25 + 5; 34*a325aa03SAugustin Cavalier static const BRect kWindowRect(0, 0, kWindowWidth, kWindowHeight); 35*a325aa03SAugustin Cavalier static const uint32 kDefaultButtonWidth = 80; 36*a325aa03SAugustin Cavalier 37*a325aa03SAugustin Cavalier // message constants 38*a325aa03SAugustin Cavalier static const uint32 kMsgButton = 'MBTN'; 39*a325aa03SAugustin Cavalier static const uint32 kMsgUpdateControls = 'UCTL'; 40*a325aa03SAugustin Cavalier 41*a325aa03SAugustin Cavalier // labels 42*a325aa03SAugustin Cavalier static const char *kLabelOK = "OK"; 43*a325aa03SAugustin Cavalier static const char *kLabelCancel = "Cancel"; 44*a325aa03SAugustin Cavalier 45*a325aa03SAugustin Cavalier 46*a325aa03SAugustin Cavalier TextRequestDialog::TextRequestDialog(const char *title, const char *information, 47*a325aa03SAugustin Cavalier const char *request, const char *text) 48*a325aa03SAugustin Cavalier : BWindow(kWindowRect, title, B_MODAL_WINDOW, B_NOT_RESIZABLE | B_NOT_CLOSABLE, 0), 49*a325aa03SAugustin Cavalier fInvoker(NULL) 50*a325aa03SAugustin Cavalier { 51*a325aa03SAugustin Cavalier BRect rect = Bounds(); 52*a325aa03SAugustin Cavalier BView *backgroundView = new BView(rect, "background", B_FOLLOW_ALL_SIDES, 0); 53*a325aa03SAugustin Cavalier backgroundView->SetViewUIColor(B_PANEL_BACKGROUND_COLOR); 54*a325aa03SAugustin Cavalier rect.InsetBy(5, 5); 55*a325aa03SAugustin Cavalier rect.bottom = rect.top; 56*a325aa03SAugustin Cavalier // init 57*a325aa03SAugustin Cavalier 58*a325aa03SAugustin Cavalier if(information) { 59*a325aa03SAugustin Cavalier BRect textRect(rect); 60*a325aa03SAugustin Cavalier textRect.OffsetTo(0, 0); 61*a325aa03SAugustin Cavalier fTextView = new BTextView(rect, "TextView", textRect, B_FOLLOW_NONE, 62*a325aa03SAugustin Cavalier B_WILL_DRAW); 63*a325aa03SAugustin Cavalier fTextView->SetViewUIColor(B_PANEL_BACKGROUND_COLOR); 64*a325aa03SAugustin Cavalier fTextView->MakeSelectable(false); 65*a325aa03SAugustin Cavalier fTextView->MakeEditable(false); 66*a325aa03SAugustin Cavalier fTextView->SetText(information); 67*a325aa03SAugustin Cavalier float textHeight = fTextView->TextHeight(0, fTextView->CountLines()); 68*a325aa03SAugustin Cavalier backgroundView->ResizeBy(0, textHeight + 5); 69*a325aa03SAugustin Cavalier ResizeBy(0, textHeight + 5); 70*a325aa03SAugustin Cavalier fTextView->ResizeBy(0, textHeight - textRect.Height()); 71*a325aa03SAugustin Cavalier rect.bottom += textHeight + 5; 72*a325aa03SAugustin Cavalier backgroundView->AddChild(fTextView); 73*a325aa03SAugustin Cavalier } else 74*a325aa03SAugustin Cavalier fTextView = NULL; 75*a325aa03SAugustin Cavalier 76*a325aa03SAugustin Cavalier rect.top = rect.bottom + 5; 77*a325aa03SAugustin Cavalier rect.bottom = rect.top + 20; 78*a325aa03SAugustin Cavalier fTextControl = new BTextControl(rect, "request", request, text, NULL); 79*a325aa03SAugustin Cavalier fTextControl->SetModificationMessage(new BMessage(kMsgUpdateControls)); 80*a325aa03SAugustin Cavalier fTextControl->SetDivider(fTextControl->StringWidth(fTextControl->Label()) + 5); 81*a325aa03SAugustin Cavalier if(text && strlen(text) > 0) 82*a325aa03SAugustin Cavalier fTextControl->TextView()->SelectAll(); 83*a325aa03SAugustin Cavalier 84*a325aa03SAugustin Cavalier rect.top = rect.bottom + 10; 85*a325aa03SAugustin Cavalier rect.bottom = rect.top + 25; 86*a325aa03SAugustin Cavalier rect.left = rect.right - kDefaultButtonWidth; 87*a325aa03SAugustin Cavalier BMessage message(kMsgButton); 88*a325aa03SAugustin Cavalier message.AddInt32("which", 1); 89*a325aa03SAugustin Cavalier fOKButton = new BButton(rect, "okButton", kLabelOK, new BMessage(message)); 90*a325aa03SAugustin Cavalier rect.right = rect.left - 10; 91*a325aa03SAugustin Cavalier rect.left = rect.right - kDefaultButtonWidth; 92*a325aa03SAugustin Cavalier message.ReplaceInt32("which", 0); 93*a325aa03SAugustin Cavalier BButton *cancelButton = new BButton(rect, "cancelButton", kLabelCancel, 94*a325aa03SAugustin Cavalier new BMessage(message)); 95*a325aa03SAugustin Cavalier backgroundView->AddChild(cancelButton); 96*a325aa03SAugustin Cavalier backgroundView->AddChild(fOKButton); 97*a325aa03SAugustin Cavalier backgroundView->AddChild(fTextControl); 98*a325aa03SAugustin Cavalier AddChild(backgroundView); 99*a325aa03SAugustin Cavalier 100*a325aa03SAugustin Cavalier fTextControl->MakeFocus(true); 101*a325aa03SAugustin Cavalier SetDefaultButton(fOKButton); 102*a325aa03SAugustin Cavalier 103*a325aa03SAugustin Cavalier UpdateControls(); 104*a325aa03SAugustin Cavalier } 105*a325aa03SAugustin Cavalier 106*a325aa03SAugustin Cavalier 107*a325aa03SAugustin Cavalier TextRequestDialog::~TextRequestDialog() 108*a325aa03SAugustin Cavalier { 109*a325aa03SAugustin Cavalier delete fInvoker; 110*a325aa03SAugustin Cavalier } 111*a325aa03SAugustin Cavalier 112*a325aa03SAugustin Cavalier 113*a325aa03SAugustin Cavalier void 114*a325aa03SAugustin Cavalier TextRequestDialog::MessageReceived(BMessage *message) 115*a325aa03SAugustin Cavalier { 116*a325aa03SAugustin Cavalier switch(message->what) { 117*a325aa03SAugustin Cavalier case kMsgButton: { 118*a325aa03SAugustin Cavalier if(!fInvoker || !fInvoker->Message()) 119*a325aa03SAugustin Cavalier return; 120*a325aa03SAugustin Cavalier 121*a325aa03SAugustin Cavalier int32 which; 122*a325aa03SAugustin Cavalier message->FindInt32("which", &which); 123*a325aa03SAugustin Cavalier BMessage toSend(*fInvoker->Message()); 124*a325aa03SAugustin Cavalier toSend.AddInt32("which", which); 125*a325aa03SAugustin Cavalier if(which == 1) 126*a325aa03SAugustin Cavalier toSend.AddString("text", fTextControl->Text()); 127*a325aa03SAugustin Cavalier 128*a325aa03SAugustin Cavalier fInvoker->Invoke(&toSend); 129*a325aa03SAugustin Cavalier PostMessage(B_QUIT_REQUESTED); 130*a325aa03SAugustin Cavalier } break; 131*a325aa03SAugustin Cavalier 132*a325aa03SAugustin Cavalier case kMsgUpdateControls: 133*a325aa03SAugustin Cavalier UpdateControls(); 134*a325aa03SAugustin Cavalier break; 135*a325aa03SAugustin Cavalier 136*a325aa03SAugustin Cavalier default: 137*a325aa03SAugustin Cavalier BWindow::MessageReceived(message); 138*a325aa03SAugustin Cavalier } 139*a325aa03SAugustin Cavalier } 140*a325aa03SAugustin Cavalier 141*a325aa03SAugustin Cavalier 142*a325aa03SAugustin Cavalier bool 143*a325aa03SAugustin Cavalier TextRequestDialog::QuitRequested() 144*a325aa03SAugustin Cavalier { 145*a325aa03SAugustin Cavalier return true; 146*a325aa03SAugustin Cavalier } 147*a325aa03SAugustin Cavalier 148*a325aa03SAugustin Cavalier 149*a325aa03SAugustin Cavalier status_t 150*a325aa03SAugustin Cavalier TextRequestDialog::Go(BInvoker *invoker) 151*a325aa03SAugustin Cavalier { 152*a325aa03SAugustin Cavalier fInvoker = invoker; 153*a325aa03SAugustin Cavalier MoveTo(center_on_screen(Bounds())); 154*a325aa03SAugustin Cavalier Show(); 155*a325aa03SAugustin Cavalier 156*a325aa03SAugustin Cavalier return B_OK; 157*a325aa03SAugustin Cavalier } 158*a325aa03SAugustin Cavalier 159*a325aa03SAugustin Cavalier 160*a325aa03SAugustin Cavalier void 161*a325aa03SAugustin Cavalier TextRequestDialog::UpdateControls() 162*a325aa03SAugustin Cavalier { 163*a325aa03SAugustin Cavalier fOKButton->SetEnabled(fTextControl->TextView()->TextLength() > 0); 164*a325aa03SAugustin Cavalier } 165