summaryrefslogtreecommitdiffstats
path: root/src/windows/identity/uilib/trackerwnd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/windows/identity/uilib/trackerwnd.c')
-rw-r--r--src/windows/identity/uilib/trackerwnd.c474
1 files changed, 0 insertions, 474 deletions
diff --git a/src/windows/identity/uilib/trackerwnd.c b/src/windows/identity/uilib/trackerwnd.c
deleted file mode 100644
index 70c3137f7..000000000
--- a/src/windows/identity/uilib/trackerwnd.c
+++ /dev/null
@@ -1,474 +0,0 @@
-/*
- * Copyright (c) 2005 Massachusetts Institute of Technology
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy,
- * modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-/* $Id$ */
-
-#define _NIMLIB_
-
-#include<khuidefs.h>
-#include<commctrl.h>
-#include<assert.h>
-
-#define K5_SLIDER_WIDTH 208
-#define K5_SLIDER_HEIGHT 40
-
-#define K5_SLIDER_LBL_HPAD 5
-#define K5_SLIDER_LBL_VPAD 22
-
-#define KHUI_TRACKER_PROP L"KhmTrackerData"
-
-
-/* Count the number of ticks between tmin and tmax, inclusive
-*/
-int time_t_to_ticks(time_t tmin, time_t tmax)
-{
- int c = 0;
- time_t lo, hi;
-
- tmin -= tmin % 60; /* our smallest gran is 1 min */
- if(tmax % 60)
- tmax += 60 - (tmax % 60);
-
- lo = tmin;
-
-#define TFORWARD(limit,gran) \
- if(lo < limit && lo < tmax) { \
- hi = min(tmax, limit); \
- c += (int)((hi - lo) / (gran)); \
- lo = hi; \
- }
-
- TFORWARD(300,60);
- TFORWARD(3600,300);
- TFORWARD(3600*4, 60*15);
- TFORWARD(3600*10,60*30);
- TFORWARD(3600*24,3600);
- TFORWARD(3600*24*4,3600*6);
- TFORWARD(((time_t)(INFINITE & INT_MAX)),3600*24);
-
-#undef TFORWARD
-
- return c;
-}
-
-/* Compute tmax given tmin and ticks such that there are ticks ticks
- between tmin and tmax
- */
-time_t ticks_to_time_t(int ticks, time_t tmin)
-{
- int c = 0;
- tmin -= tmin % 60; /* our smallest gran is 1 min */
-
-#define SFORWARD(limit,gran) \
- if(tmin < limit && ticks > 0) { \
- c = (int) min(ticks, (limit - tmin) / (gran)); \
- tmin += c * gran; \
- ticks -= c; \
- }
-
- SFORWARD(300,60);
- SFORWARD(3600,300);
- SFORWARD(3600*4,60*15);
- SFORWARD(3600*10,60*30);
- SFORWARD(3600*24,3600);
- SFORWARD(3600*24*4,3600*6);
- SFORWARD(((time_t)(INFINITE & INT_MAX)),3600*24);
-
-#undef SFORWARD
-
- return tmin;
-}
-
-/* Prep a tracker control which works in conjunction with the
- duration edit control.
-
- NOTE: Runs in the context of the UI thread
-*/
-void
-initialize_tracker(HWND hwnd,
- khui_tracker * tc)
-{
- RECT r;
- FILETIME ft;
- wchar_t wbuf[256];
- khm_size cbbuf;
-
- SendMessage(tc->hw_slider, TBM_SETRANGE, 0, MAKELONG(0, time_t_to_ticks(tc->min, tc->max)));
- SendMessage(tc->hw_slider, TBM_SETPOS, TRUE, (LPARAM) time_t_to_ticks(tc->min, tc->current));
-
- r.left = K5_SLIDER_LBL_HPAD;
- r.top = K5_SLIDER_LBL_VPAD;
- r.right = K5_SLIDER_WIDTH - K5_SLIDER_LBL_HPAD;
- r.bottom = r.top;
-
- MapDialogRect(hwnd, &r);
-
- tc->lbl_y = r.top;
- tc->lbl_lx = r.left;
- tc->lbl_rx = r.right;
-
- TimetToFileTimeInterval(tc->current, &ft);
- cbbuf = sizeof(wbuf);
- FtIntervalToString(&ft, wbuf, &cbbuf);
-
- SendMessage(tc->hw_edit, WM_SETTEXT, 0, (LPARAM)wbuf);
-}
-
-
-/* We instance-subclass each tracker control to provide the
- functionality that we need. This is the replacement window
- procedure
-
- NOTE: Runs in the context of the UI thread
- */
-LRESULT CALLBACK
-duration_tracker_proc(HWND hwnd,
- UINT uMsg,
- WPARAM wParam,
- LPARAM lParam)
-{
- khui_tracker * tc;
-
- tc = (khui_tracker *) GetProp(hwnd, KHUI_TRACKER_PROP);
-#ifdef DEBUG
- assert(tc != NULL);
-#endif
-
- switch(uMsg) {
- case WM_PAINT:
- {
- HDC hdc;
- HFONT hf, hfold;
- LRESULT lr;
- FILETIME ft;
- wchar_t buf[256];
- khm_size cbbuf;
-
- lr = CallWindowProc(tc->fn_tracker, hwnd, uMsg, wParam, lParam);
-
- /* Can't use BeginPaint here, since we already called the
- window proc */
- hdc = GetWindowDC(hwnd);
-
- hf = (HFONT) SendMessage(tc->hw_edit, WM_GETFONT, 0, 0);
-
- hfold = ((HFONT) SelectObject((hdc), (HGDIOBJ)(HFONT)(hf)));
-
- TimetToFileTimeInterval(tc->min, &ft);
- cbbuf = sizeof(buf);
- FtIntervalToString(&ft, buf, &cbbuf);
-
- SetTextColor(hdc, RGB(0,0,0));
- SetBkMode(hdc, TRANSPARENT);
-
- SetTextAlign(hdc, TA_LEFT | TA_TOP | TA_NOUPDATECP);
- TextOut(hdc, tc->lbl_lx, tc->lbl_y, buf, (int) wcslen(buf));
-
- TimetToFileTimeInterval(tc->max, &ft);
- cbbuf = sizeof(buf);
- FtIntervalToString(&ft, buf, &cbbuf);
-
- SetTextAlign(hdc, TA_RIGHT | TA_TOP | TA_NOUPDATECP);
- TextOut(hdc, tc->lbl_rx, tc->lbl_y, buf, (int) wcslen(buf));
-
- ((HFONT) SelectObject((hdc), (HGDIOBJ)(HFONT)(hfold)));
-
- ReleaseDC(hwnd, hdc);
-
- return lr;
- }
- break;
-
- case WM_KILLFOCUS:
- {
- if((HWND)wParam != tc->hw_edit)
- ShowWindow(hwnd, SW_HIDE);
- }
- break;
-
- case WM_LBUTTONUP:
- case WM_MOUSEMOVE:
- {
- LRESULT lr;
-
- lr = CallWindowProc(tc->fn_tracker, hwnd, uMsg, wParam, lParam);
-
- if(wParam & MK_LBUTTON) {
- int c = (int) SendMessage(hwnd, TBM_GETPOS, 0, 0);
- time_t t = ticks_to_time_t(c, tc->min);
-
- if(t != tc->current) {
- wchar_t buf[256];
- FILETIME ft;
- khm_size cbbuf;
-
- tc->current = t;
- //d->dirty = TRUE;
- cbbuf = sizeof(buf);
- TimetToFileTimeInterval(t, &ft);
- FtIntervalToString(&ft, buf, &cbbuf);
- SendMessage(tc->hw_edit, WM_SETTEXT, 0, (LPARAM) buf);
- }
- }
- return lr;
- }
- }
-
- return CallWindowProc(tc->fn_tracker, hwnd, uMsg, wParam, lParam);
-}
-
-
-/* Create the subclassed duration slider on behalf of an edit control */
-void
-create_edit_sliders(HWND hwnd,
- HWND hwnd_dlg,
- khui_tracker * tc)
-{
- RECT r;
- RECT rs;
-
- GetWindowRect(hwnd, &r);
-
- rs.top = 0;
- rs.left = 0;
- rs.right = K5_SLIDER_WIDTH;
- rs.bottom = K5_SLIDER_HEIGHT;
- MapDialogRect(hwnd_dlg, &rs);
- rs.right -= rs.left;
- rs.bottom -= rs.top;
-
- tc->hw_slider =
- CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,
- TRACKBAR_CLASS,
- L"NetIDMgrTimeTickerTrackbar",
- WS_POPUP | TBS_AUTOTICKS | TBS_BOTTOM |
-#if (_WIN32_IE >= 0x0501)
- TBS_DOWNISLEFT |
-#endif
- TBS_HORZ | WS_CLIPCHILDREN,
- r.left,r.bottom,rs.right,rs.bottom,
- hwnd,
- NULL,
- (HINSTANCE)(DWORD_PTR)
- GetWindowLongPtr(hwnd, GWLP_HINSTANCE),
- NULL);
-
- SetProp(tc->hw_slider, KHUI_TRACKER_PROP,
- (HANDLE) tc);
-
-#pragma warning(push)
-#pragma warning(disable: 4244)
- tc->fn_tracker = (WNDPROC)(LONG_PTR) SetWindowLongPtr(tc->hw_slider, GWLP_WNDPROC, (LONG_PTR) duration_tracker_proc);
-#pragma warning(pop)
-}
-
-/* An edit control is instance-subclassed to create an edit control
- that holds a duration. Welcome to the window procedure.
-
- NOTE: Runs in the context of the UI thread
- */
-LRESULT CALLBACK
-duration_edit_proc(HWND hwnd,
- UINT uMsg,
- WPARAM wParam,
- LPARAM lParam)
-{
- khui_tracker * tc;
-
- tc = (khui_tracker *) GetProp(hwnd, KHUI_TRACKER_PROP);
-
-#ifdef DEBUG
- assert(tc != NULL);
-#endif
-
- switch(uMsg) {
- case WM_SETFOCUS:
- {
- HWND p;
-
- p = GetParent(hwnd);
-
- /* we are being activated. */
- if(tc->hw_slider == NULL) {
- create_edit_sliders(hwnd, p, tc);
- initialize_tracker(p, tc);
- }
-
- khui_tracker_reposition(tc);
-
-#ifdef SHOW_PANEL_ON_FIRST_ACTIVATE
- ShowWindow(tc->hw_slider, SW_SHOWNOACTIVATE);
-#endif
-
- tc->act_time = GetTickCount();
- }
- break;
-
- case WM_KILLFOCUS:
- {
- wchar_t wbuf[256];
- FILETIME ft;
- khm_size cbbuf;
-
- if((HWND) wParam != tc->hw_slider)
- ShowWindow(tc->hw_slider, SW_HIDE);
-
- TimetToFileTimeInterval(tc->current, &ft);
- cbbuf = sizeof(wbuf);
- FtIntervalToString(&ft, wbuf, &cbbuf);
-
- SendMessage(tc->hw_edit, WM_SETTEXT, 0, (LPARAM)wbuf);
- }
- break;
-
- case KHUI_WM_NC_NOTIFY:
- if(HIWORD(wParam) == WMNC_DIALOG_SETUP) {
- HWND p;
-
- p = GetParent(hwnd);
-
- if(tc->hw_slider == NULL) {
- create_edit_sliders(hwnd,p,tc);
- }
-
- initialize_tracker(p, tc);
- }
- return TRUE;
-
- case WM_LBUTTONUP:
- if (IsWindowVisible(tc->hw_slider)) {
- DWORD tm;
-
- tm = GetTickCount();
- if (tm - tc->act_time > 000)
- ShowWindow(tc->hw_slider, SW_HIDE);
- } else {
- ShowWindow(tc->hw_slider, SW_SHOWNOACTIVATE);
- }
- break;
-
- /* these messages can potentially change the text in the edit
- control. We intercept them and see what changed. We may
- need to grab and handle them */
- case EM_REPLACESEL:
- case EM_UNDO:
- case WM_UNDO:
- case WM_CHAR:
-#if (_WIN32_WINNT >= 0x0501)
- case WM_UNICHAR:
-#endif
- {
- wchar_t buf[256];
- size_t nchars;
- time_t ts;
- FILETIME ft;
- BOOL modified;
- LRESULT lr = CallWindowProc(tc->fn_edit, hwnd, uMsg, wParam, lParam);
-
- modified = (BOOL) SendMessage(hwnd, EM_GETMODIFY, 0, 0);
- if(modified) {
- /* parse the string */
- if(nchars = (size_t) SendMessage(hwnd, WM_GETTEXT, ARRAYLENGTH(buf), (LPARAM) buf)) {
- buf[nchars] = 0;
-
- if(KHM_SUCCEEDED(IntervalStringToFt(&ft, buf))) {
- ts = FtIntervalToSeconds(&ft);
- if(ts >= tc->min && ts <= tc->max) {
- tc->current = ts;
- //d->dirty = TRUE;
- if(tc->hw_slider != NULL)
- SendMessage(tc->hw_slider, TBM_SETPOS, TRUE, (LPARAM) time_t_to_ticks(tc->min, tc->current));
- }
- }
- }
- SendMessage(hwnd, EM_SETMODIFY, FALSE, 0);
- }
-
- return lr;
- }
- }
-
- return CallWindowProc(tc->fn_edit, hwnd, uMsg, wParam, lParam);
-}
-
-KHMEXP void KHMAPI
-khui_tracker_install(HWND hwnd_edit, khui_tracker * tc) {
-#ifdef DEBUG
- assert(hwnd_edit);
- assert(tc);
-#endif
-
- tc->hw_edit = hwnd_edit;
-
- SetProp(hwnd_edit, KHUI_TRACKER_PROP, (HANDLE) tc);
-
-#pragma warning(push)
-#pragma warning(disable: 4244)
- tc->fn_edit = (WNDPROC)(LONG_PTR)
- SetWindowLongPtr(hwnd_edit, GWLP_WNDPROC,
- (LONG_PTR) duration_edit_proc);
-#pragma warning(pop)
-}
-
-KHMEXP void KHMAPI
-khui_tracker_reposition(khui_tracker * tc) {
- RECT r;
-
- if(tc->hw_slider && tc->hw_edit) {
- GetWindowRect(tc->hw_edit, &r);
- SetWindowPos(tc->hw_slider,
- NULL,
- r.left, r.bottom,
- 0, 0,
- SWP_NOOWNERZORDER | SWP_NOSIZE |
- SWP_NOZORDER | SWP_NOACTIVATE);
- }
-}
-
-KHMEXP void KHMAPI
-khui_tracker_initialize(khui_tracker * tc) {
- ZeroMemory(tc, sizeof(*tc));
-}
-
-KHMEXP void KHMAPI
-khui_tracker_refresh(khui_tracker * tc) {
- if (!tc->hw_edit)
- return;
-
- SendMessage(tc->hw_edit,
- KHUI_WM_NC_NOTIFY,
- MAKEWPARAM(0,WMNC_DIALOG_SETUP), 0);
-}
-
-KHMEXP void KHMAPI
-khui_tracker_kill_controls(khui_tracker * tc) {
- if (tc->hw_slider)
- DestroyWindow(tc->hw_slider);
- if (tc->hw_edit)
- DestroyWindow(tc->hw_edit);
- tc->hw_slider = NULL;
- tc->hw_edit = NULL;
- tc->fn_edit = NULL;
- tc->fn_tracker = NULL;
-}