/* -*- 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. */ // // Mike Pinkerton, Netscape Communications // // Contains: // // ¥ SelectorImage // an abstract class for drawing the workspace icon // // ¥ TitleImage // implements above // // ¥ CNavCenterSelectorPane // handles drawing/clicking/tooltips/etc of workspaces and all powerplant interactions // #pragma once #include #include #include "LString.h" #include "htrdf.h" #include "CDynamicTooltips.h" #include "CURLDragHelper.h" #include "CImageIconMixin.h" #include "il_types.h" class CIconContext; class CNavCenterSelectorPane; #pragma mark -- class SelectorImage and SelectorData -- // // SelectorImage // // An abstract base class that knows how to draw itself in the appropriate mode (text/icon/text&icon) // as well as selected or not-selected. // class SelectorImage : public CImageIconMixin { public: SelectorImage ( const string & inURL ) : CImageIconMixin(inURL) { } ; virtual ~SelectorImage ( ) { } ; virtual void DrawInCurrentView( const Rect& bounds, unsigned long mode ) const = 0; }; // // SelectorData // // an element within the Nav Center workspace list. // struct SelectorData { SelectorData ( HT_View inView, CNavCenterSelectorPane* inSelectorBar ) ; ~SelectorData(); SelectorImage* workspaceImage; // ptr to object that knows how to draw workspace icon }; #pragma mark -- class CNavCenterSelectorPane -- // // CNavCenterSelectorPane // // Draws the workspace icons in a vertical table. Handles setting the currently selected // workspace when an icon is clicked on and telling the RDFCoordinator to change the open/close // state of the shelf if need be. // class CNavCenterSelectorPane : public LView, public LDragAndDrop, public LBroadcaster, public LCommander, public CDynamicTooltipMixin, public CHTAwareURLDragMixin { public: friend class CNavCenterSelectorContextMenuAttachment; // modes for drawing icons enum { kSelected = 1, kIcon = 2, kText = 4 }; // powerplant stuff (panes and messages) enum { class_ID = 'NvSl', msg_ShelfStateShouldChange = 'shlf', // broadcast when shelf should open/close msg_ActiveSelectorChanged = 'selc' // broadcast when selector changes }; CNavCenterSelectorPane( LStream* ); virtual ~CNavCenterSelectorPane(); // Tell view to select the next workspace, wrapping around if we hit the ends virtual void CycleCurrentWorkspace ( ) ; // Tell view if it is in a browser window void SetEmbedded ( bool isEmbedded ) { mIsEmbedded = isEmbedded; } // Get/Set info about the HT_Pane that contains all the workspaces to display void SetHTPane ( HT_Pane inPane ) { mHTPane = inPane; } HT_Pane GetHTPane ( ) const { return mHTPane; } // access and change the current workspace. void SetActiveWorkspace ( HT_View inNewWorkspace ) ; HT_View GetActiveWorkspace ( ) const { return mCachedWorkspace; } protected: enum EDropLocation { kDropBefore, kDropOn, kDropAfter } ; // PowerPlant overrides virtual void DrawSelf(); virtual void ClickSelf( const SMouseDownEvent& ); virtual void AdjustCursorSelf( Point, const EventRecord& ); virtual void FindCommandStatus ( CommandT inCommand, Boolean &outEnabled, Boolean &outUsesMark, Char16 &outMark, Str255 outName) ; // redraw when things change and broadcast that they have. virtual void NoticeActiveWorkspaceChanged ( HT_View iter ) ; // click handling size_t FindIndexForPoint ( const Point & inMouseLoc ) const; size_t FindIndexForPoint ( const Point & inMouseLoc, EDropLocation & outWhere ) const ; HT_View FindSelectorForPoint ( const Point & inMouseLoc ) const; HT_View FindSelectorForPoint ( const Point & inMouseLoc, EDropLocation & outWhere, TableIndexT & outRowBefore ) const; // stuff for dynamic tooltips virtual void FindTooltipForMouseLocation ( const EventRecord& inMacEvent, StringPtr outTip ) ; virtual void MouseWithin ( Point inPortPt, const EventRecord& ) ; virtual void MouseLeave ( ) ; // stuff for drag and drop virtual Boolean ItemIsAcceptable ( DragReference inDragRef, ItemReference inItemRef ) ; virtual void InsideDropArea ( DragReference inDragRef ) ; virtual void EnterDropArea ( DragReference inDragRef, Boolean inDragHasLeftSender ) ; virtual void LeaveDropArea ( DragReference inDragRef ) ; virtual void DrawDividingLine( TableIndexT inRow, EDropLocation inPrep ) ; virtual void HandleDropOfHTResource ( HT_Resource node ) ; virtual void HandleDropOfPageProxy ( const char* inURL, const char* inTitle ) ; virtual void HandleDropOfLocalFile ( const char* inFileURL, const char* fileName, const HFSFlavor & /*inFileData*/ ) ; virtual void HandleDropOfText ( const char* inTextData ) ; virtual void ReceiveDragItem ( DragReference inDragRef, DragAttributes inDragAttrs, ItemReference inItemRef, Rect & inItemBounds ) ; bool mIsEmbedded; // is this embedded in chrome or standalone window? HT_Pane mHTPane; HT_View mCachedWorkspace; // which view is currently active? short mTooltipIndex; // which item is mouse hovering over bool mMouseIsInsidePane; // is the mouse in the pane? Uint32 mDragAndDropTickCount; // used only during d&d as a timer TableIndexT mDropRow; // row mouse is over during a drop. // holds |LArray::index_Last| when invalid EDropLocation mDropPreposition; // where does drop go, in relation to mDropRow? unsigned long mImageMode; size_t mCellHeight; }; // class CNavCenterSelectorPane #pragma mark -- class TitleImage -- // // TitleImage // // Display the image for the workspace (and possibly the title). The icon will be a gif/jpeg // loaded from the URL specified in HT. // class TitleImage : public SelectorImage { public: TitleImage ( const LStr255 & inTitle, ResIDT inIconID, const string & inIconURL, CNavCenterSelectorPane* inSelectorBar ) ; ~TitleImage ( ) ; virtual void DrawInCurrentView( const Rect& bounds, unsigned long mode ) const ; const LStr255 & Title ( ) const { return mTitle; } ; ResIDT IconID ( ) const { return mIconID; } ; Uint16 TextWidth ( ) const { return mTextWidth; } ; protected: // overrides for CImageIconMixin to handle drawing of images virtual void ListenToMessage ( MessageT inMessage, void* inData ) ; virtual void DrawStandby ( const Point & inTopLeft, const IconTransformType inTransform ) const ; private: #if DRAW_SELECTED_AS_TAB virtual void DrawOneTab(RgnHandle inBounds) const; virtual void DrawTopBevel(RgnHandle inTab) const; virtual void DrawBottomBevel(RgnHandle inTab, Boolean inCurrentTab) const; virtual void DrawOneTabBackground( RgnHandle inRegion, Boolean inCurrentTab) const; virtual void DrawOneTabFrame(RgnHandle inRegion, Boolean inCurrentTab) const; virtual void DrawCurrentTabSideClip(RgnHandle inRegion) const; #endif LStr255 mTitle; ResIDT mIconID; Uint16 mTextWidth; CNavCenterSelectorPane* mSelector; // selector bar reference, so it can be told when // we need to redraw the image }; // classTitleImage