mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-06 00:55:37 +00:00
341 lines
11 KiB
C++
341 lines
11 KiB
C++
/* -*- 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.
|
|
*/
|
|
|
|
#ifndef __H_CMouseDragger
|
|
#define __H_CMouseDragger
|
|
#pragma once
|
|
|
|
/*======================================================================================
|
|
AUTHOR: Ted Morris - 25 SEPT 96
|
|
©1996 Netscape Communications Corp. All rights reserved worldwide.
|
|
|
|
DESCRIPTION: Implements a class used for tracking a mouse action within an LView
|
|
class and making it undoable.
|
|
|
|
To use this class, do the following:
|
|
|
|
MODIFICATIONS:
|
|
|
|
Date Person Description
|
|
---- ------ -----------
|
|
======================================================================================*/
|
|
|
|
|
|
/*====================================================================================*/
|
|
#pragma mark INCLUDE FILES
|
|
/*====================================================================================*/
|
|
|
|
#include <LView.h>
|
|
#include <LTableView.h>
|
|
|
|
|
|
/*====================================================================================*/
|
|
#pragma mark TYPEDEFS
|
|
/*====================================================================================*/
|
|
|
|
|
|
/*====================================================================================*/
|
|
#pragma mark CONSTANTS
|
|
/*====================================================================================*/
|
|
|
|
|
|
/*====================================================================================*/
|
|
#pragma mark CLASS DECLARATIONS
|
|
/*====================================================================================*/
|
|
|
|
#pragma mark -
|
|
|
|
class LImageRect {
|
|
|
|
public:
|
|
|
|
LImageRect(void) {
|
|
Set(0, 0, 0, 0);
|
|
}
|
|
LImageRect(Int32 inLeft, Int32 inTop, Int32 inRight, Int32 inBottom) {
|
|
Set(inLeft, inTop, inRight, inBottom);
|
|
}
|
|
LImageRect(const LImageRect *inImageRect) {
|
|
Set(inImageRect->Left(), inImageRect->Top(),
|
|
inImageRect->Right(), inImageRect->Bottom());
|
|
}
|
|
|
|
Int32 Left(void) const {
|
|
return mTopLeft.h;
|
|
}
|
|
Int32 Top(void) const {
|
|
return mTopLeft.v;
|
|
}
|
|
Int32 Right(void) const {
|
|
return mBotRight.h;
|
|
}
|
|
Int32 Bottom(void) const {
|
|
return mBotRight.v;
|
|
}
|
|
void Left(Int32 inValue) {
|
|
mTopLeft.h = inValue;
|
|
}
|
|
void Top(Int32 inValue) {
|
|
mTopLeft.v = inValue;
|
|
}
|
|
void Right(Int32 inValue) {
|
|
mBotRight.h = inValue;
|
|
}
|
|
void Bottom(Int32 inValue) {
|
|
mBotRight.v = inValue;
|
|
}
|
|
void Set(const LImageRect *inImageRect) {
|
|
mTopLeft.h = inImageRect->Left();
|
|
mTopLeft.v = inImageRect->Top();
|
|
mBotRight.h = inImageRect->Right();
|
|
mBotRight.v = inImageRect->Bottom();
|
|
}
|
|
void Set(Int32 inLeft, Int32 inTop, Int32 inRight, Int32 inBottom) {
|
|
mTopLeft.h = inLeft;
|
|
mTopLeft.v = inTop;
|
|
mBotRight.h = inRight;
|
|
mBotRight.v = inBottom;
|
|
}
|
|
void Offset(Int32 inDeltaH, Int32 inDeltaV) {
|
|
mTopLeft.h += inDeltaH;
|
|
mTopLeft.v += inDeltaV;
|
|
mBotRight.h += inDeltaH;
|
|
mBotRight.v += inDeltaV;
|
|
}
|
|
SPoint32 *TopLeft(void) {
|
|
return &mTopLeft;
|
|
}
|
|
SPoint32 *BotRight(void) {
|
|
return &mBotRight;
|
|
}
|
|
Boolean IsEmpty(void) const {
|
|
return ((mTopLeft.h >= mBotRight.h) || (mTopLeft.v >= mBotRight.v));
|
|
}
|
|
Boolean PointIn(Int32 inHorz, Int32 inVert) const {
|
|
return (((inHorz >= mTopLeft.h) && (inHorz < mBotRight.h)) &&
|
|
((inVert >= mTopLeft.v) && (inVert < mBotRight.v)));
|
|
}
|
|
Boolean PinPoint(Int32 *ioHorz, Int32 *ioVert) const {
|
|
Boolean rtnVal = false;
|
|
if ( *ioHorz < mTopLeft.h ) {
|
|
*ioHorz = mTopLeft.h; rtnVal = true;
|
|
} else if ( *ioHorz >= mBotRight.h ) {
|
|
*ioHorz = mBotRight.h; rtnVal = true;
|
|
}
|
|
if ( *ioVert < mTopLeft.v ) {
|
|
*ioVert = mTopLeft.v; rtnVal = true;
|
|
} else if ( *ioVert >= mBotRight.v ) {
|
|
*ioVert = mBotRight.v; rtnVal = true;
|
|
}
|
|
return rtnVal;
|
|
}
|
|
|
|
static Boolean EqualPoints32(const SPoint32 *inPointA, const SPoint32 *inPointB) {
|
|
return ((inPointA->h == inPointB->h) && (inPointA->v == inPointB->v));
|
|
}
|
|
|
|
protected:
|
|
|
|
// Instance variables ==========================================================
|
|
|
|
SPoint32 mTopLeft;
|
|
SPoint32 mBotRight;
|
|
};
|
|
|
|
#pragma mark -
|
|
|
|
class CMouseDragger {
|
|
|
|
public:
|
|
|
|
CMouseDragger(void) {
|
|
}
|
|
virtual ~CMouseDragger(void) {
|
|
}
|
|
|
|
// Start public interface ----------------------------------------------------------
|
|
|
|
Boolean DoTrackMouse(LView *inView, const SPoint32 *inStartMouseImagePt,
|
|
const LImageRect *inMouseImagePinRect = nil,
|
|
const Int16 inMinHMoveStart = 1, const Int16 inMinVMoveStart = 1);
|
|
|
|
// End public interface ------------------------------------------------------------
|
|
|
|
static Boolean CanScrollView(LView *inView, Point inGlobalMousePt,
|
|
const Rect *inGlobalViewFrame = nil);
|
|
|
|
static void GlobalToImagePt(LView *inView, Point inGlobalPt,
|
|
SPoint32 *outImagePt);
|
|
static void ImageToPortPt(LView *inView, const SPoint32 *inImagePt,
|
|
Point *outPortPt);
|
|
static void PortToImagePt(LView *inView, Point inPortPoint,
|
|
SPoint32 *outImagePt);
|
|
static void PortToImageRect(LView *inView, const Rect *inPortRect,
|
|
LImageRect *outImageRect);
|
|
static void ImageToLocalRect(LView *inView, LImageRect *inImageRect,
|
|
Rect *outLocalRect);
|
|
|
|
protected:
|
|
|
|
// Override methods
|
|
|
|
virtual void BeginTracking(const SPoint32 *inStartMouseImagePt);
|
|
|
|
virtual Boolean KeepTracking(const SPoint32 *inStartMouseImagePt,
|
|
const SPoint32 *inPrevMouseImagePt,
|
|
const SPoint32 *inCurrMouseImagePt);
|
|
|
|
virtual void EndTracking(const SPoint32 *inStartMouseImagePt,
|
|
const SPoint32 *inEndMouseImagePt);
|
|
|
|
virtual void AboutToScrollView(const SPoint32 *inStartMouseImagePt,
|
|
const SPoint32 *inCurrMouseImagePt);
|
|
virtual void DoneScrollingView(const SPoint32 *inStartMouseImagePt,
|
|
const SPoint32 *inCurrMouseImagePt);
|
|
|
|
enum EDrawRegionState {
|
|
eDoErase = 0 // Normal erase
|
|
, eDoEraseScroll = 1 // Erase just before a scoll
|
|
, eDoDraw = 2 // Draw
|
|
};
|
|
|
|
virtual void DrawDragRegion(const SPoint32 *inStartMouseImagePt,
|
|
const SPoint32 *inCurrMouseImagePt,
|
|
EDrawRegionState inDrawState);
|
|
|
|
// Instance variables ==========================================================
|
|
|
|
LView *mView;
|
|
SPoint32 mStartImagePt;
|
|
SPoint32 mEndImagePt;
|
|
};
|
|
|
|
|
|
// Class specific for dragging rows in an LTableView. Be careful, it hasn't been
|
|
// tested on a wide range of LTableView descendents! Also, assumes that the
|
|
// table only has a single column! Note: This class also assumes the presence
|
|
// of icm8 resources for the arrow icons.
|
|
|
|
/*======================================================================================
|
|
The ClickCell() method for your table will look something like this:
|
|
|
|
void CMyTableView::ClickCell(const STableCell &inCell, const SMouseDownEvent &inMouseDown) {
|
|
|
|
if ( LPane::GetClickCount() == 2 ) {
|
|
|
|
// Do double click stuff
|
|
|
|
} else if ( mRows > 1 ) {
|
|
|
|
CTableRowDragger dragger(inCell.row);
|
|
|
|
SPoint32 startMouseImagePt;
|
|
LocalToImagePoint(inMouseDown.whereLocal, startMouseImagePt);
|
|
|
|
// Restrict dragging to a thin vertical column the height of the image
|
|
|
|
LImageRect dragPinRect;
|
|
{
|
|
Int32 left, top, right, bottom;
|
|
GetImageCellBounds(inCell, left, top, right, bottom);
|
|
dragPinRect.Set(startMouseImagePt.h, startMouseImagePt.v - top, startMouseImagePt.h,
|
|
mImageSize.height - (bottom - startMouseImagePt.v) + 1);
|
|
}
|
|
|
|
TrySetCursor(cHandClosedCursorID);
|
|
dragger.DoTrackMouse(this, &startMouseImagePt, &dragPinRect, 2, 2);
|
|
|
|
TableIndexT newRow = dragger.GetDraggedRow();
|
|
|
|
if ( newRow ) {
|
|
CMyMoveRowAction *action = new CMyMoveRowAction(this, inCell.row, newRow);
|
|
FailNIL_(action);
|
|
PostAction(action);
|
|
}
|
|
}
|
|
}
|
|
======================================================================================*/
|
|
|
|
// CTableRowDragger
|
|
|
|
class CTableRowDragger : public CMouseDragger {
|
|
|
|
public:
|
|
|
|
CTableRowDragger(TableIndexT inClickedRow) :
|
|
CMouseDragger(),
|
|
mClickedRow(inClickedRow),
|
|
mOverRow(inClickedRow),
|
|
mNumCols(1) {
|
|
|
|
}
|
|
|
|
TableIndexT GetDraggedRow(void) {
|
|
return ((mClickedRow == mOverRow) ? 0 : mOverRow);
|
|
}
|
|
|
|
protected:
|
|
|
|
enum { // Constants
|
|
icm8_LeftInsertArrow = 29203
|
|
, icm8_RightInsertArrow = 29204
|
|
, cArrowVCenterTopOffset = 3
|
|
, cArrowPolyWidth = 4
|
|
, cArrowHMargin = 1
|
|
, cSmallIconWidth = 16
|
|
, cSmallIconHeight = 12
|
|
|
|
};
|
|
|
|
virtual void BeginTracking(const SPoint32 *inStartMouseImagePt);
|
|
virtual void EndTracking(const SPoint32 *inStartMouseImagePt,
|
|
const SPoint32 *inEndMouseImagePt);
|
|
|
|
virtual void DrawDragRegion(const SPoint32 *inStartMouseImagePt,
|
|
const SPoint32 *inCurrMouseImagePt,
|
|
EDrawRegionState inDrawState);
|
|
void UpdateInsertionPoint(const LImageRect *inImageCellDrawRect,
|
|
LTableView *inTableView,
|
|
EDrawRegionState inDrawState);
|
|
void CalcArrowRects(Int16 inPortLineV, Rect *outLeftRect, Rect *outRightRect,
|
|
Boolean inErase);
|
|
|
|
// Instance variables ==========================================================
|
|
|
|
TableIndexT mClickedRow; // The row that was clicked
|
|
TableIndexT mOverRow; // The current row that the mouse is over
|
|
TableIndexT mNumCols; // The current row that the mouse is over
|
|
|
|
Boolean mDidDraw;
|
|
|
|
Int16 mPortInsertionLineV; // Port vertical coordinate that the last
|
|
// insertion line and arrows was draw at,
|
|
// min_Int16 if no line was last drawn
|
|
Int16 mPortInsertionLineLeft; // Port left coordinate for drawing the insertion line
|
|
Int16 mPortInsertionLineRight;// Port right coordinate for drawing the insertion line
|
|
|
|
Rect mPortLeftArrowBox;
|
|
Rect mPortRightArrowBox;
|
|
|
|
Int16 mPortFrameMinV;
|
|
Int16 mPortFrameMaxV;
|
|
};
|
|
|
|
|
|
#endif // __H_CMouseDragger
|