1/* 2 * Copyright 2017 Haiku Inc. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Brian Hill 7 */ 8 9 10#include "AddRepoWindow.h" 11 12#include <Alert.h> 13#include <Application.h> 14#include <Catalog.h> 15#include <Clipboard.h> 16#include <LayoutBuilder.h> 17#include <Url.h> 18 19#include "constants.h" 20 21#undef B_TRANSLATION_CONTEXT 22#define B_TRANSLATION_CONTEXT "AddRepoWindow" 23 24static float sAddWindowWidth = 500.0; 25 26 27AddRepoWindow::AddRepoWindow(BRect size, const BMessenger& messenger) 28 : 29 BWindow(BRect(0, 0, sAddWindowWidth, 10), "AddWindow", B_MODAL_WINDOW, 30 B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS | B_CLOSE_ON_ESCAPE), 31 fReplyMessenger(messenger) 32{ 33 fText = new BTextControl("text", B_TRANSLATE_COMMENT("Repository URL:", 34 "Text box label"), "", new BMessage(ADD_BUTTON_PRESSED)); 35 fAddButton = new BButton(B_TRANSLATE_COMMENT("Add", "Button label"), 36 new BMessage(ADD_BUTTON_PRESSED)); 37 fAddButton->MakeDefault(true); 38 fCancelButton = new BButton(kCancelLabel, 39 new BMessage(CANCEL_BUTTON_PRESSED)); 40 41 BLayoutBuilder::Group<>(this, B_VERTICAL) 42 .SetInsets(B_USE_WINDOW_SPACING) 43 .Add(fText) 44 .AddGroup(B_HORIZONTAL, B_USE_DEFAULT_SPACING) 45 .AddGlue() 46 .Add(fCancelButton) 47 .Add(fAddButton) 48 .End() 49 .End(); 50 _GetClipboardData(); 51 fText->MakeFocus(); 52 53 // Move to the center of the preflet window 54 CenterIn(size); 55 float widthDifference = size.Width() - Frame().Width(); 56 if (widthDifference < 0) 57 MoveBy(widthDifference / 2.0, 0); 58 Show(); 59} 60 61 62void 63AddRepoWindow::Quit() 64{ 65 fReplyMessenger.SendMessage(ADD_WINDOW_CLOSED); 66 BWindow::Quit(); 67} 68 69 70void 71AddRepoWindow::MessageReceived(BMessage* message) 72{ 73 switch (message->what) 74 { 75 case CANCEL_BUTTON_PRESSED: 76 if (QuitRequested()) 77 Quit(); 78 break; 79 80 case ADD_BUTTON_PRESSED: 81 { 82 BString url(fText->Text()); 83 if (url != "") { 84 // URL must have a protocol 85 BUrl newRepoUrl(url); 86 if (!newRepoUrl.IsValid()) { 87 BAlert* alert = new BAlert("error", 88 B_TRANSLATE_COMMENT("This is not a valid URL.", 89 "Add URL error message"), 90 kOKLabel, NULL, NULL, B_WIDTH_AS_USUAL, B_STOP_ALERT); 91 alert->SetFeel(B_MODAL_APP_WINDOW_FEEL); 92 alert->Go(NULL); 93 // Center the alert to this window and move down some 94 alert->CenterIn(Frame()); 95 alert->MoveBy(0, kAddWindowOffset); 96 } else { 97 BMessage* addMessage = new BMessage(ADD_REPO_URL); 98 addMessage->AddString(key_url, url); 99 fReplyMessenger.SendMessage(addMessage); 100 Quit(); 101 } 102 } 103 break; 104 } 105 106 default: 107 BWindow::MessageReceived(message); 108 } 109} 110 111 112void 113AddRepoWindow::FrameResized(float newWidth, float newHeight) 114{ 115 sAddWindowWidth = newWidth; 116} 117 118 119status_t 120AddRepoWindow::_GetClipboardData() 121{ 122 if (be_clipboard->Lock()) { 123 const char* string; 124 ssize_t stringLen; 125 BMessage* clip = be_clipboard->Data(); 126 clip->FindData("text/plain", B_MIME_TYPE, (const void **)&string, 127 &stringLen); 128 be_clipboard->Unlock(); 129 130 // The string must be a valid url 131 BString clipString(string, stringLen); 132 BUrl testUrl(clipString.String()); 133 if (!testUrl.IsValid()) 134 return B_ERROR; 135 else 136 fText->SetText(clipString); 137 } 138 return B_OK; 139} 140