summaryrefslogtreecommitdiff
path: root/prev/wintable/coord.h
diff options
context:
space:
mode:
authorPietro Gagliardi <[email protected]>2016-05-30 00:14:46 -0400
committerPietro Gagliardi <[email protected]>2016-05-30 00:14:46 -0400
commit52f7d276a6bb04b8827ac019ad1e135b43819cea (patch)
tree5f0ebbfdf5885ef832e77e243b5916e59f46ba18 /prev/wintable/coord.h
parentc9b32c1333e4009b342eedc5f5b39127a724fb42 (diff)
Removed prev/.
Diffstat (limited to 'prev/wintable/coord.h')
-rw-r--r--prev/wintable/coord.h164
1 files changed, 0 insertions, 164 deletions
diff --git a/prev/wintable/coord.h b/prev/wintable/coord.h
deleted file mode 100644
index 52a70c9..0000000
--- a/prev/wintable/coord.h
+++ /dev/null
@@ -1,164 +0,0 @@
-// 4 december 2014
-
-// TODO find a better place for these (metrics.h?)
-static LONG textHeight(struct table *t, HDC dc, BOOL select)
-{
- BOOL release;
- HFONT prevfont, newfont;
- TEXTMETRICW tm;
-
- release = FALSE;
- if (dc == NULL) {
- dc = GetDC(t->hwnd);
- if (dc == NULL)
- panic("error getting Table DC for rowHeight()");
- release = TRUE;
- }
- if (select)
- prevfont = selectFont(t, dc, &newfont);
- if (GetTextMetricsW(dc, &tm) == 0)
- panic("error getting text metrics for rowHeight()");
- if (select)
- deselectFont(dc, prevfont, newfont);
- if (release)
- if (ReleaseDC(t->hwnd, dc) == 0)
- panic("error releasing Table DC for rowHeight()");
- return tm.tmHeight;
-}
-
-#define tableImageWidth() GetSystemMetrics(SM_CXSMICON)
-#define tableImageHeight() GetSystemMetrics(SM_CYSMICON)
-
-// TODO omit column types that are not present?
-static LONG rowHeight(struct table *t, HDC dc, BOOL select)
-{
- LONG height;
- LONG tmHeight;
-
- height = tableImageHeight(); // start with this to avoid two function calls
- tmHeight = textHeight(t, dc, select);
- if (height < tmHeight)
- height = tmHeight;
- if (height < t->checkboxHeight)
- height = t->checkboxHeight;
- return height;
-}
-
-#define rowht(t) rowHeight(t, NULL, TRUE)
-
-struct rowcol {
- intptr_t row;
- intptr_t column;
-};
-
-static struct rowcol clientCoordToRowColumn(struct table *t, POINT pt)
-{
- RECT r;
- struct rowcol rc;
- intptr_t i;
-
- if (GetClientRect(t->hwnd, &r) == 0)
- panic("error getting Table client rect in clientCoordToRowColumn()");
- r.top += t->headerHeight;
- if (PtInRect(&r, pt) == 0)
- goto outside;
-
- // the row is easy
- pt.y -= t->headerHeight;
- rc.row = (pt.y / rowht(t)) + t->vscrollpos;
- if (rc.row >= t->count)
- goto outside;
-
- // the column... not so much
- // we scroll p.x, then subtract column widths until we cross the left edge of the control
- pt.x += t->hscrollpos;
- rc.column = 0;
- for (i = 0; i < t->nColumns; i++) {
- pt.x -= columnWidth(t, i);
- // use <, not <=, here:
- // assume r.left and t->hscrollpos == 0;
- // given the first column is 100 wide,
- // pt.x == 0 (first pixel of col 0) -> p.x - 100 == -100 < 0 -> break
- // pt.x == 99 (last pixel of col 0) -> p.x - 100 == -1 < 0 -> break
- // pt.x == 100 (first pixel of col 1) -> p.x - 100 == 0 >= 0 -> next column
- if (pt.x < r.left)
- break;
- rc.column++;
- }
- if (rc.column >= t->nColumns)
- goto outside;
-
- return rc;
-
-outside:
- rc.row = -1;
- rc.column = -1;
- return rc;
-}
-
-// same as client coordinates, but stored in a lParam (like the various mouse messages provide)
-static struct rowcol lParamToRowColumn(struct table *t, LPARAM lParam)
-{
- POINT pt;
-
- pt.x = GET_X_LPARAM(lParam);
- pt.y = GET_Y_LPARAM(lParam);
- return clientCoordToRowColumn(t, pt);
-}
-
-// returns TRUE if the row is visible (even partially visible) and thus has a rectangle in the client area; FALSE otherwise
-static BOOL rowColumnToClientRect(struct table *t, struct rowcol rc, RECT *r)
-{
- RECT client;
- RECT out; // don't change r if we return FALSE
- LONG height;
- intptr_t xpos;
- intptr_t i;
-
- if (rc.row < t->vscrollpos)
- return FALSE;
- rc.row -= t->vscrollpos; // align with client.top
-
- if (GetClientRect(t->hwnd, &client) == 0)
- panic("error getting Table client rect in rowColumnToClientRect()");
- client.top += t->headerHeight;
-
- height = rowht(t);
- out.top = client.top + (rc.row * height);
- if (out.top >= client.bottom) // >= because RECT.bottom is the first pixel outside the rectangle
- return FALSE;
- out.bottom = out.top + height;
-
- // and again the columns are the hard part
- // so we start with client.left - t->hscrollpos, then keep adding widths until we get to the column we want
- xpos = client.left - t->hscrollpos;
- for (i = 0; i < rc.column; i++)
- xpos += columnWidth(t, i);
- // did we stray too far to the right? if so it's not visible
- if (xpos >= client.right) // >= because RECT.right is the first pixel outside the rectangle
- return FALSE;
- out.left = xpos;
- out.right = xpos + columnWidth(t, rc.column);
- // and is this too far to the left?
- if (out.right < client.left) // < because RECT.left is the first pixel inside the rect
- return FALSE;
-
- *r = out;
- return TRUE;
-}
-
-// TODO idealCoordToRowColumn/rowColumnToIdealCoord?
-
-static void toCellContentRect(struct table *t, RECT *r, LRESULT xoff, intptr_t width, intptr_t height)
-{
- if (xoff == 0)
- xoff = SendMessageW(t->header, HDM_GETBITMAPMARGIN, 0, 0);
- r->left += xoff;
- if (width != 0)
- r->right = r->left + width;
- if (height != 0)
- // TODO vertical center
- r->bottom = r->top + height;
-}
-
-#define toCheckboxRect(t, r, xoff) toCellContentRect(t, r, xoff, t->checkboxWidth, t->checkboxHeight)