1/*
2 * Copyright 1999-2010, Be Incorporated. All Rights Reserved.
3 * This file may be used under the terms of the Be Sample Code License.
4 *
5 * OverlayImage is based on the code presented in this article:
6 * http://www.haiku-os.org/documents/dev/replishow_a_replicable_image_viewer
7 *
8 * Authors:
9 *			Seth Flexman
10 *			Hartmuth Reh
11 *			Humdinger		<humdingerb@gmail.com>
12 */
13
14#include "OverlayView.h"
15
16#include <AboutWindow.h>
17#include <Catalog.h>
18#include <InterfaceDefs.h>
19#include <Locale.h>
20#include <String.h>
21#include <TextView.h>
22
23
24#undef B_TRANSLATION_CONTEXT
25#define B_TRANSLATION_CONTEXT "Main view"
26
27const float kDraggerSize = 7;
28
29
30OverlayView::OverlayView(BRect frame)
31	:
32	BView(frame, "OverlayImage", B_FOLLOW_NONE, B_WILL_DRAW)
33{
34	fBitmap = NULL;
35	fReplicated = false;
36
37	frame.left = frame.right - kDraggerSize;
38	frame.top = frame.bottom - kDraggerSize;
39	BDragger* dragger = new BDragger(frame, this, B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM);
40	AddChild(dragger);
41
42	SetViewColor(B_TRANSPARENT_COLOR);
43
44	fText = new BTextView(Bounds(), "bgView", Bounds(), B_FOLLOW_ALL, B_WILL_DRAW);
45	fText->SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
46	rgb_color color = ui_color(B_PANEL_TEXT_COLOR);
47	fText->SetFontAndColor(be_plain_font, B_FONT_ALL, &color);
48	AddChild(fText);
49	BString text;
50	text << B_TRANSLATE(
51		"Enable \"Show replicants\" in Deskbar.\n"
52		"Drag & drop an image.\n"
53		"Drag the replicant to the Desktop.");
54	fText->SetText(text);
55	fText->SetAlignment(B_ALIGN_CENTER);
56	fText->MakeEditable(false);
57	fText->MakeSelectable(false);
58	fText->MoveBy(0, (Bounds().bottom - fText->TextRect().bottom) / 2);
59}
60
61
62OverlayView::OverlayView(BMessage* archive)
63	:
64	BView(archive)
65{
66	fReplicated = true;
67	fBitmap = new BBitmap(archive);
68}
69
70
71OverlayView::~OverlayView()
72{
73	delete fBitmap;
74}
75
76
77void
78OverlayView::Draw(BRect)
79{
80	SetDrawingMode(B_OP_ALPHA);
81	SetViewColor(B_TRANSPARENT_COLOR);
82
83	if (fBitmap)
84		DrawBitmap(fBitmap, B_ORIGIN);
85}
86
87
88void
89OverlayView::MessageReceived(BMessage* msg)
90{
91	switch (msg->what) {
92		case B_SIMPLE_DATA:
93		{
94			if (fReplicated)
95				break;
96
97			entry_ref ref;
98			msg->FindRef("refs", &ref);
99			BEntry entry(&ref);
100			BPath path(&entry);
101
102			delete fBitmap;
103			fBitmap = BTranslationUtils::GetBitmap(path.Path());
104
105			if (fBitmap != NULL) {
106				if (fText != NULL) {
107					RemoveChild(fText);
108					fText = NULL;
109				}
110
111				BRect rect = fBitmap->Bounds();
112				if (!fReplicated) {
113					Window()->ResizeTo(rect.right, rect.bottom);
114					Window()->Activate(true);
115				}
116				ResizeTo(rect.right, rect.bottom);
117				Invalidate();
118			}
119			break;
120		}
121		case B_ABOUT_REQUESTED:
122		{
123			OverlayAboutRequested();
124			break;
125		}
126		case B_COLORS_UPDATED:
127		{
128			rgb_color color;
129			if (msg->FindColor(ui_color_name(B_PANEL_TEXT_COLOR), &color) == B_OK)
130				fText->SetFontAndColor(be_plain_font, B_FONT_ALL, &color);
131			break;
132		}
133		default:
134			BView::MessageReceived(msg);
135			break;
136	}
137}
138
139
140BArchivable*
141OverlayView::Instantiate(BMessage* data)
142{
143	return new OverlayView(data);
144}
145
146
147status_t
148OverlayView::Archive(BMessage* archive, bool deep) const
149{
150	BView::Archive(archive, deep);
151
152	archive->AddString("add_on", kAppSignature);
153	archive->AddString("class", "OverlayImage");
154
155	if (fBitmap) {
156		fBitmap->Lock();
157		fBitmap->Archive(archive);
158		fBitmap->Unlock();
159	}
160
161	return B_OK;
162}
163
164
165void
166OverlayView::OverlayAboutRequested()
167{
168	BAboutWindow* aboutwindow
169		= new BAboutWindow(B_TRANSLATE_SYSTEM_NAME("OverlayImage"), kAppSignature);
170
171	const char* authors[] = {
172		"Seth Flaxman",
173		"Hartmuth Reh",
174		"Humdinger",
175		NULL
176	};
177
178	aboutwindow->AddCopyright(1999, "Seth Flaxman");
179	aboutwindow->AddCopyright(2010, "Haiku, Inc.");
180	aboutwindow->AddAuthors(authors);
181	aboutwindow->Show();
182}
183