1 /* vim: se cin sw=2 ts=2 et : */
2 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
3 *
4 * This Source Code Form is subject to the terms of the Mozilla Public
5 * License, v. 2.0. If a copy of the MPL was not distributed with this
6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7
8 #include <windows.h>
9 #include <strsafe.h>
10
11 #include "TaskbarWindowPreview.h"
12 #include "TaskbarPreviewButton.h"
13 #include "nsWindowGfx.h"
14 #include <imgIContainer.h>
15
16 namespace mozilla {
17 namespace widget {
18
NS_IMPL_ISUPPORTS(TaskbarPreviewButton,nsITaskbarPreviewButton,nsISupportsWeakReference)19 NS_IMPL_ISUPPORTS(TaskbarPreviewButton, nsITaskbarPreviewButton,
20 nsISupportsWeakReference)
21
22 TaskbarPreviewButton::TaskbarPreviewButton(TaskbarWindowPreview *preview,
23 uint32_t index)
24 : mPreview(preview), mIndex(index) {}
25
~TaskbarPreviewButton()26 TaskbarPreviewButton::~TaskbarPreviewButton() { SetVisible(false); }
27
28 NS_IMETHODIMP
GetTooltip(nsAString & aTooltip)29 TaskbarPreviewButton::GetTooltip(nsAString &aTooltip) {
30 aTooltip = mTooltip;
31 return NS_OK;
32 }
33
34 NS_IMETHODIMP
SetTooltip(const nsAString & aTooltip)35 TaskbarPreviewButton::SetTooltip(const nsAString &aTooltip) {
36 mTooltip = aTooltip;
37 size_t destLength = sizeof Button().szTip / (sizeof Button().szTip[0]);
38 wchar_t *tooltip = &(Button().szTip[0]);
39 StringCchCopyNW(tooltip, destLength, mTooltip.get(), mTooltip.Length());
40 return Update();
41 }
42
43 NS_IMETHODIMP
GetDismissOnClick(bool * dismiss)44 TaskbarPreviewButton::GetDismissOnClick(bool *dismiss) {
45 *dismiss = (Button().dwFlags & THBF_DISMISSONCLICK) == THBF_DISMISSONCLICK;
46 return NS_OK;
47 }
48
49 NS_IMETHODIMP
SetDismissOnClick(bool dismiss)50 TaskbarPreviewButton::SetDismissOnClick(bool dismiss) {
51 if (dismiss)
52 Button().dwFlags |= THBF_DISMISSONCLICK;
53 else
54 Button().dwFlags &= ~THBF_DISMISSONCLICK;
55 return Update();
56 }
57
58 NS_IMETHODIMP
GetHasBorder(bool * hasBorder)59 TaskbarPreviewButton::GetHasBorder(bool *hasBorder) {
60 *hasBorder = (Button().dwFlags & THBF_NOBACKGROUND) != THBF_NOBACKGROUND;
61 return NS_OK;
62 }
63
64 NS_IMETHODIMP
SetHasBorder(bool hasBorder)65 TaskbarPreviewButton::SetHasBorder(bool hasBorder) {
66 if (hasBorder)
67 Button().dwFlags &= ~THBF_NOBACKGROUND;
68 else
69 Button().dwFlags |= THBF_NOBACKGROUND;
70 return Update();
71 }
72
73 NS_IMETHODIMP
GetDisabled(bool * disabled)74 TaskbarPreviewButton::GetDisabled(bool *disabled) {
75 *disabled = (Button().dwFlags & THBF_DISABLED) == THBF_DISABLED;
76 return NS_OK;
77 }
78
79 NS_IMETHODIMP
SetDisabled(bool disabled)80 TaskbarPreviewButton::SetDisabled(bool disabled) {
81 if (disabled)
82 Button().dwFlags |= THBF_DISABLED;
83 else
84 Button().dwFlags &= ~THBF_DISABLED;
85 return Update();
86 }
87
88 NS_IMETHODIMP
GetImage(imgIContainer ** img)89 TaskbarPreviewButton::GetImage(imgIContainer **img) {
90 if (mImage)
91 NS_ADDREF(*img = mImage);
92 else
93 *img = nullptr;
94 return NS_OK;
95 }
96
97 NS_IMETHODIMP
SetImage(imgIContainer * img)98 TaskbarPreviewButton::SetImage(imgIContainer *img) {
99 if (Button().hIcon) ::DestroyIcon(Button().hIcon);
100 if (img) {
101 nsresult rv;
102 rv = nsWindowGfx::CreateIcon(
103 img, false, 0, 0,
104 nsWindowGfx::GetIconMetrics(nsWindowGfx::kRegularIcon),
105 &Button().hIcon);
106 NS_ENSURE_SUCCESS(rv, rv);
107 } else {
108 Button().hIcon = nullptr;
109 }
110 return Update();
111 }
112
113 NS_IMETHODIMP
GetVisible(bool * visible)114 TaskbarPreviewButton::GetVisible(bool *visible) {
115 *visible = (Button().dwFlags & THBF_HIDDEN) != THBF_HIDDEN;
116 return NS_OK;
117 }
118
119 NS_IMETHODIMP
SetVisible(bool visible)120 TaskbarPreviewButton::SetVisible(bool visible) {
121 if (visible)
122 Button().dwFlags &= ~THBF_HIDDEN;
123 else
124 Button().dwFlags |= THBF_HIDDEN;
125 return Update();
126 }
127
Button()128 THUMBBUTTON &TaskbarPreviewButton::Button() {
129 return mPreview->mThumbButtons[mIndex];
130 }
131
Update()132 nsresult TaskbarPreviewButton::Update() {
133 return mPreview->UpdateButton(mIndex);
134 }
135
136 } // namespace widget
137 } // namespace mozilla
138