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