From c1670471d4ea9a5b3e7b603d084c1e245104832a Mon Sep 17 00:00:00 2001 From: "pinkerton%netscape.com" Date: Mon, 24 Aug 1998 23:54:19 +0000 Subject: [PATCH] First Checked In. --- .../UserInterface/Tables/CTableTooltipPane.cp | 176 ++++++++++++++++++ .../UserInterface/Tables/CTableTooltipPane.h | 79 ++++++++ 2 files changed, 255 insertions(+) create mode 100644 lib/mac/UserInterface/Tables/CTableTooltipPane.cp create mode 100644 lib/mac/UserInterface/Tables/CTableTooltipPane.h diff --git a/lib/mac/UserInterface/Tables/CTableTooltipPane.cp b/lib/mac/UserInterface/Tables/CTableTooltipPane.cp new file mode 100644 index 00000000000..c0656d218cd --- /dev/null +++ b/lib/mac/UserInterface/Tables/CTableTooltipPane.cp @@ -0,0 +1,176 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + + +#include "CTableToolTipPane.h" + +#include "CStandardFlexTable.h" +#include "UGraphicGizmos.h" + +//---------------------------------------------------------------------------------------- +CTableToolTipAttachment::CTableToolTipAttachment(LStream* inStream) +//---------------------------------------------------------------------------------------- + : Inherited(inStream) +{ + mPaneMustBeActive = false; +} + +#pragma mark - + +//---------------------------------------------------------------------------------------- +CTableToolTipPane::CTableToolTipPane(LStream* inStream) + : CToolTipPane(inStream) +//---------------------------------------------------------------------------------------- +{ +} // CTableToolTipPane::CTableToolTipPane + +//---------------------------------------------------------------------------------------- +void CTableToolTipPane::DrawSelf() +//---------------------------------------------------------------------------------------- +{ + Rect theFrame; + CalcLocalFrameRect(theFrame); + ::EraseRect(&theFrame); + ::FrameRect(&theFrame); + UTextTraits::SetPortTextTraits(mTextDrawingStuff.mTextTraitsID); + ::TextFace(mTextDrawingStuff.style); + ::TextMode(mTextDrawingStuff.mode); + ::RGBForeColor(&mTextDrawingStuff.color); + theFrame.left += 2; + if (mTextDrawingStuff.encoding == CStandardFlexTable::TextDrawingStuff::eDefault) + UGraphicGizmos::PlaceStringInRect(mTip, theFrame, teFlushDefault); + else + UGraphicGizmos::DrawUTF8TextString(mTip, nil, 0, theFrame, teFlushDefault); +} // CTableToolTipPane::DrawSelf + +//---------------------------------------------------------------------------------------- +Boolean CTableToolTipPane::WantsToCancel(Point inMousePort) +// Cancel if we detect that we're now in a new cell, because the tooltip has to be +// recalculated. +//---------------------------------------------------------------------------------------- +{ + STableCell currentCell; + if (GetTableAndCell(inMousePort, currentCell)) + { + static STableCell sLastCell(0, 0); + if (currentCell == sLastCell) + return false; + sLastCell = currentCell; + } + return true; +} // CTableToolTipPane::WantsToCancel + +//---------------------------------------------------------------------------------------- +void CTableToolTipPane::CalcTipText( + LWindow* inOwningWindow, + const EventRecord& inMacEvent, + StringPtr outTipText) +//---------------------------------------------------------------------------------------- +{ + STableCell cell; + Point where = inMacEvent.where; + inOwningWindow->GlobalToPortPoint(where); + outTipText[0] = 0; + CStandardFlexTable* table = GetTableAndCell(where, cell); + if (!table) + return; + table->CalcToolTipText(cell, outTipText, mTextDrawingStuff, mTruncationOnly); +} // CTableToolTipPane::CalcTipText + +//---------------------------------------------------------------------------------------- +void CTableToolTipPane::CalcFrameWithRespectTo( + LWindow* inOwningWindow, + const EventRecord& inMacEvent, + Rect& outPortFrame) +//---------------------------------------------------------------------------------------- +{ + StTextState theTextSaver; + UTextTraits::SetPortTextTraits(mTextDrawingStuff.mTextTraitsID); + ::TextFace(mTextDrawingStuff.style); + ::TextMode(mTextDrawingStuff.mode); + ::RGBForeColor(&mTextDrawingStuff.color); + + Int16 theTextHeight + = mTextDrawingStuff.mTextFontInfo.ascent + + mTextDrawingStuff.mTextFontInfo.descent + + mTextDrawingStuff.mTextFontInfo.leading + + (2 * 2); + Int16 theTextWidth = ::StringWidth(mTip) + 4; //(2 * ::CharWidth(char_Space)); + + inOwningWindow->FocusDraw(); + + Rect theOwningPortFrame; + mOwningPane->CalcPortFrameRect(theOwningPortFrame); + + // Find which cell the mouse is over + STableCell cell; + Point where = inMacEvent.where; + inOwningWindow->GlobalToPortPoint(where); + CStandardFlexTable* table = GetTableAndCell(where, cell); + if (!table) + return; + // Get a rectangle for the text. Normally, it's the cell rect. But if it's the hilite cell, + // make sure we don't cover over the icon (unless we're forced to to make it fit) + table->FocusDraw(); + table->GetLocalCellRect(cell, outPortFrame); + outPortFrame.right--; // that's what CStandardFlexTable::DrawCell does + if (cell.col == table->GetHiliteColumn()) + { + Rect hiliteRect; + table->GetHiliteTextRect(cell.row, false, hiliteRect); + outPortFrame.left = hiliteRect.left; + outPortFrame.left -= 2; // looks better. + } + + table->LocalToPortPoint(topLeft(outPortFrame)); + table->LocalToPortPoint(botRight(outPortFrame)); + + Int16 textRight = outPortFrame.left + theTextWidth; + if (mTruncationOnly && textRight <= outPortFrame.right) + { + outPortFrame.right = outPortFrame.left; // No tooltip + return; + } + else + outPortFrame.right = outPortFrame.left + theTextWidth; + + inOwningWindow->FocusDraw(); + ForceInPortFrame(inOwningWindow, outPortFrame); +} // CTableToolTipPane::CalcFrameWithRespectTo + +//---------------------------------------------------------------------------------------- +CStandardFlexTable* CTableToolTipPane::GetTableAndCell( + Point inMousePort, + STableCell& outCell) +//---------------------------------------------------------------------------------------- +{ + CStandardFlexTable* table = dynamic_cast(mOwningPane); + Assert_(table); + if (table) + { + table->FocusDraw(); + Point mouseLocal = inMousePort; + table->PortToLocalPoint(mouseLocal); + SPoint32 whereImage; + table->LocalToImagePoint(mouseLocal, whereImage); + if (!table->GetCellHitBy(whereImage, outCell)) + table = nil; + } + return table; +} // CTableToolTipPane::GetTableAndCell + diff --git a/lib/mac/UserInterface/Tables/CTableTooltipPane.h b/lib/mac/UserInterface/Tables/CTableTooltipPane.h new file mode 100644 index 00000000000..42b7932b379 --- /dev/null +++ b/lib/mac/UserInterface/Tables/CTableTooltipPane.h @@ -0,0 +1,79 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#include "CTooltipAttachment.h" + +#include "CStandardFlexTable.h" + +//======================================================================================== +class CTableToolTipAttachment +// A minimal override of CToolTipAttachment, which currently changes only the +// setting of the mMustBeActive flag to false. +//======================================================================================== +: public CToolTipAttachment +{ + private: + typedef CToolTipAttachment Inherited; + + public: + enum { class_ID = 'TTTa' }; + + CTableToolTipAttachment(LStream* inStream); + +}; // class CTableToolTipAttachment + +//======================================================================================== +class CTableToolTipPane +// This gives a cell-by-cell tooltip that appears aligned with a cell in CStandardFlexTable. +// Use the resid of a table tooltip pane (11509) to get this behavior. It calls the method +// of CStandardFlexTable::CalcTipText() to get the text of each cell. If the table +// returns an empty string, then no tooltip appears for the cell. +//======================================================================================== +: public CToolTipPane +{ + private: + typedef CToolTipPane Inherited; + + public: + enum { class_ID = 'TTTp' }; + + CTableToolTipPane(LStream* inStream); + + virtual void CalcFrameWithRespectTo( + LWindow* inOwningWindow, + const EventRecord& inMacEvent, + Rect& outTipFrame); + + virtual void CalcTipText( + LWindow* inOwningWindow, + const EventRecord& inMacEvent, + StringPtr outTipText); + virtual CStandardFlexTable* GetTableAndCell( + Point inMousePort, + STableCell& outCell); + virtual Boolean WantsToCancel( + Point inMousePort); + virtual void DrawSelf(); + + protected: + CStandardFlexTable::TextDrawingStuff + mTextDrawingStuff; + Boolean mTruncationOnly; // tooltip has no extra information, + // and should only be shown if it doesn't fit + // in the underlying cell. +}; // class CTableTooltipPane \ No newline at end of file