1 /*
2 * Copyright 2006-2009, Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 * Stephan Aßmus <superstippi@gmx.de>
7 */
8
9 #include "WonderBrushView.h"
10
11 #include <stdio.h>
12 #include <string.h>
13
14 #include <Catalog.h>
15 #include <LayoutBuilder.h>
16 #include <MenuBar.h>
17 #include <MenuField.h>
18 #include <MenuItem.h>
19 #include <PopUpMenu.h>
20 #include <StringView.h>
21 #include <Window.h>
22
23 #include "WonderBrushImage.h"
24 #include "WonderBrushTranslator.h"
25
26
27 #undef B_TRANSLATION_CONTEXT
28 #define B_TRANSLATION_CONTEXT "WonderBrushView"
29
30
31 const char* kAuthor = "Stephan Aßmus, <superstippi@gmx.de>";
32 const char* kWBICopyright = B_UTF8_COPYRIGHT " 2006 Haiku Inc.";
33
34
35 void
add_menu_item(BMenu * menu,uint32 compression,const char * label,uint32 currentCompression)36 add_menu_item(BMenu* menu,
37 uint32 compression,
38 const char* label,
39 uint32 currentCompression)
40 {
41 BMessage* message = new BMessage(WonderBrushView::MSG_COMPRESSION_CHANGED);
42 message->AddInt32("value", compression);
43 BMenuItem* item = new BMenuItem(label, message);
44 item->SetMarked(currentCompression == compression);
45 menu->AddItem(item);
46 }
47
48
WonderBrushView(const BRect & frame,const char * name,uint32 resize,uint32 flags,TranslatorSettings * settings)49 WonderBrushView::WonderBrushView(const BRect &frame, const char *name,
50 uint32 resize, uint32 flags, TranslatorSettings *settings)
51 : BView(frame, name, resize, flags),
52 fSettings(settings)
53 {
54 SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
55
56 BStringView *titleView = new BStringView("title",
57 B_TRANSLATE("WonderBrush image translator"));
58 titleView->SetFont(be_bold_font);
59
60 char version[100];
61 sprintf(version, B_TRANSLATE("Version %d.%d.%d, %s"),
62 static_cast<int>(B_TRANSLATION_MAJOR_VERSION(WBI_TRANSLATOR_VERSION)),
63 static_cast<int>(B_TRANSLATION_MINOR_VERSION(WBI_TRANSLATOR_VERSION)),
64 static_cast<int>(B_TRANSLATION_REVISION_VERSION(
65 WBI_TRANSLATOR_VERSION)), __DATE__);
66
67 BStringView *versionView = new BStringView("version", version);
68 BStringView *copyrightView = new BStringView("copyright", kWBICopyright);
69 BStringView *copyright2View = new BStringView("copyright2", B_TRANSLATE("written by:"));
70 BStringView *copyright3View = new BStringView("copyright3", kAuthor);
71
72 BLayoutBuilder::Group<>(this, B_VERTICAL, 0)
73 .SetInsets(B_USE_DEFAULT_SPACING)
74 .Add(titleView)
75 .Add(versionView)
76 .Add(copyrightView)
77 .AddGlue()
78 .Add(copyright2View)
79 .Add(copyright3View);
80 }
81
82
~WonderBrushView()83 WonderBrushView::~WonderBrushView()
84 {
85 fSettings->Release();
86 }
87
88
89 void
MessageReceived(BMessage * message)90 WonderBrushView::MessageReceived(BMessage* message)
91 {
92 switch (message->what) {
93 default:
94 BView::MessageReceived(message);
95 }
96 }
97
98
99 void
AttachedToWindow()100 WonderBrushView::AttachedToWindow()
101 {
102 // Hack for DataTranslations which doesn't resize visible area to requested by view
103 // which makes some parts of bigger than usual translationviews out of visible area
104 // so if it was loaded to DataTranslations resize window if needed
105 BWindow *window = Window();
106 if (!strcmp(window->Name(), "DataTranslations")) {
107 BView *view = Parent();
108 if (view) {
109 BRect frame = view->Frame();
110 float x, y;
111 GetPreferredSize(&x, &y);
112 if (frame.Width() < x || (frame.Height() - 48) < y) {
113 x -= frame.Width();
114 y -= frame.Height() - 48;
115 if (x < 0) x = 0;
116 if (y < 0) y = 0;
117
118 // DataTranslations has main view called "Background"
119 // change it's resizing mode so it will always resize with window
120 // also make sure view will be redrawed after resize
121 view = window->FindView("Background");
122 if (view) {
123 view->SetResizingMode(B_FOLLOW_ALL);
124 view->SetFlags(B_FULL_UPDATE_ON_RESIZE);
125 }
126
127 // The same with "Info..." button, except redrawing, which isn't needed
128 view = window->FindView("Info" B_UTF8_ELLIPSIS);
129 if (view)
130 view->SetResizingMode(B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM);
131
132 window->ResizeBy( x, y);
133 }
134 }
135 }
136 }
137
138 void
GetPreferredSize(float * width,float * height)139 WonderBrushView::GetPreferredSize(float* width, float* height)
140 {
141 if (width) {
142 // look at the two widest strings
143 float width1 = StringWidth(kWBICopyright) + 15.0;
144 float width2 = be_plain_font->StringWidth(kAuthor) + 15.0;
145
146 *width = max_c(width1, width2);
147 }
148
149 if (height) {
150 // take the height of the bold system font and
151 // the number of lines of text we render
152 font_height fh;
153 be_bold_font->GetHeight(&fh);
154 float ybold = fh.ascent + fh.descent * 2 + fh.leading;
155
156 *height = 7 * ybold;
157 }
158 }
159