зеркало из https://github.com/mozilla/pjs.git
Bug 109772. Some nsIView deCOMtamination. Fixed the API for GetNeearestWidget to be sensible. r+sr=dbaron
This commit is contained in:
Родитель
fe2e0655fe
Коммит
a2c6a75e31
|
@ -4072,13 +4072,6 @@ nsCSSFrameConstructor::ConstructSelectFrame(nsIPresShell* aPresShell,
|
|||
InitializeSelectFrame(aPresShell, aPresContext, aState, listFrame, scrolledFrame, aContent, comboboxFrame,
|
||||
listStyle, PR_FALSE, PR_FALSE, PR_TRUE);
|
||||
newFrame = listFrame;
|
||||
// XXX Temporary for Bug 19416
|
||||
{
|
||||
nsIView* lstView = scrolledFrame->GetView();
|
||||
if (lstView) {
|
||||
lstView->IgnoreSetPosition(PR_TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
// Set flag so the events go to the listFrame not child frames.
|
||||
// XXX: We should replace this with a real widget manager similar
|
||||
|
|
|
@ -1703,18 +1703,9 @@ nsComboboxControlFrame::ShowDropDown(PRBool aDoDropDown)
|
|||
}
|
||||
|
||||
if (!mDroppedDown && aDoDropDown) {
|
||||
// XXX Temporary for Bug 19416
|
||||
nsIView* lstView = mDropdownFrame->GetView();
|
||||
if (lstView) {
|
||||
lstView->IgnoreSetPosition(PR_FALSE);
|
||||
}
|
||||
if (mListControlFrame) {
|
||||
mListControlFrame->SyncViewWithFrame(mPresContext);
|
||||
}
|
||||
// XXX Temporary for Bug 19416
|
||||
if (lstView) {
|
||||
lstView->IgnoreSetPosition(PR_TRUE);
|
||||
}
|
||||
ToggleList(mPresContext);
|
||||
return NS_OK;
|
||||
} else if (mDroppedDown && !aDoDropDown) {
|
||||
|
|
|
@ -1216,10 +1216,7 @@ nsObjectFrame::InstantiateWidget(nsIPresContext* aPresContext,
|
|||
return rv;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIWidget> parent;
|
||||
parentWithView->GetOffsetFromWidget(nsnull, nsnull, *getter_AddRefs(parent));
|
||||
mWidget->Create(NS_STATIC_CAST(nsIWidget*, parent), r, nsnull, nsnull);
|
||||
|
||||
mWidget->Create(parentWithView->GetNearestWidget(nsnull), r, nsnull, nsnull);
|
||||
mWidget->Show(PR_TRUE);
|
||||
return rv;
|
||||
}
|
||||
|
@ -4049,28 +4046,13 @@ static void ConvertRelativeToWindowAbsolute(nsIFrame* aFrame,
|
|||
aAbs = aFrame->GetPosition();
|
||||
}
|
||||
|
||||
NS_ASSERTION(view, "the object frame does not have a view");
|
||||
if (view) {
|
||||
// Caclulate the views offset from its nearest widget
|
||||
|
||||
nscoord viewx = 0;
|
||||
nscoord viewy = 0;
|
||||
aContainerWidget = view->GetWidget();
|
||||
// Calculate the view's offset from its nearest widget
|
||||
nsPoint viewOffset;
|
||||
aContainerWidget = view->GetNearestWidget(&viewOffset);
|
||||
NS_IF_ADDREF(aContainerWidget);
|
||||
if (!aContainerWidget) {
|
||||
view->GetOffsetFromWidget(&viewx, &viewy, aContainerWidget/**getter_AddRefs(widget)*/);
|
||||
aAbs.x += viewx;
|
||||
aAbs.y += viewy;
|
||||
|
||||
|
||||
// GetOffsetFromWidget does not include the views offset, so we need to add
|
||||
// that in.
|
||||
aAbs += view->GetPosition();
|
||||
}
|
||||
|
||||
nsRect widgetBounds;
|
||||
aContainerWidget->GetBounds(widgetBounds);
|
||||
} else {
|
||||
NS_ASSERTION(PR_FALSE, "the object frame does not have a view");
|
||||
aAbs += viewOffset;
|
||||
}
|
||||
|
||||
// Add relative coordinate to the absolute coordinate that has been calculated
|
||||
|
|
|
@ -127,11 +127,8 @@ nsPageFrame::SetInitialChildList(nsIPresContext* aPresContext,
|
|||
{
|
||||
nsIView* view = aChildList->GetView();
|
||||
if (view && mDoCreateWidget) {
|
||||
nscoord dx, dy;
|
||||
nsCOMPtr<nsIWidget> widget;
|
||||
view->GetOffsetFromWidget(&dx, &dy, *getter_AddRefs(widget));
|
||||
nsCOMPtr<nsIPrintPreviewContext> ppContext = do_QueryInterface(aPresContext);
|
||||
if (ppContext && widget) {
|
||||
if (ppContext && view->GetNearestWidget(nsnull)) {
|
||||
view->CreateWidget(kCChildCID);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1216,10 +1216,7 @@ nsObjectFrame::InstantiateWidget(nsIPresContext* aPresContext,
|
|||
return rv;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIWidget> parent;
|
||||
parentWithView->GetOffsetFromWidget(nsnull, nsnull, *getter_AddRefs(parent));
|
||||
mWidget->Create(NS_STATIC_CAST(nsIWidget*, parent), r, nsnull, nsnull);
|
||||
|
||||
mWidget->Create(parentWithView->GetNearestWidget(nsnull), r, nsnull, nsnull);
|
||||
mWidget->Show(PR_TRUE);
|
||||
return rv;
|
||||
}
|
||||
|
@ -4049,28 +4046,13 @@ static void ConvertRelativeToWindowAbsolute(nsIFrame* aFrame,
|
|||
aAbs = aFrame->GetPosition();
|
||||
}
|
||||
|
||||
NS_ASSERTION(view, "the object frame does not have a view");
|
||||
if (view) {
|
||||
// Caclulate the views offset from its nearest widget
|
||||
|
||||
nscoord viewx = 0;
|
||||
nscoord viewy = 0;
|
||||
aContainerWidget = view->GetWidget();
|
||||
// Calculate the view's offset from its nearest widget
|
||||
nsPoint viewOffset;
|
||||
aContainerWidget = view->GetNearestWidget(&viewOffset);
|
||||
NS_IF_ADDREF(aContainerWidget);
|
||||
if (!aContainerWidget) {
|
||||
view->GetOffsetFromWidget(&viewx, &viewy, aContainerWidget/**getter_AddRefs(widget)*/);
|
||||
aAbs.x += viewx;
|
||||
aAbs.y += viewy;
|
||||
|
||||
|
||||
// GetOffsetFromWidget does not include the views offset, so we need to add
|
||||
// that in.
|
||||
aAbs += view->GetPosition();
|
||||
}
|
||||
|
||||
nsRect widgetBounds;
|
||||
aContainerWidget->GetBounds(widgetBounds);
|
||||
} else {
|
||||
NS_ASSERTION(PR_FALSE, "the object frame does not have a view");
|
||||
aAbs += viewOffset;
|
||||
}
|
||||
|
||||
// Add relative coordinate to the absolute coordinate that has been calculated
|
||||
|
|
|
@ -127,11 +127,8 @@ nsPageFrame::SetInitialChildList(nsIPresContext* aPresContext,
|
|||
{
|
||||
nsIView* view = aChildList->GetView();
|
||||
if (view && mDoCreateWidget) {
|
||||
nscoord dx, dy;
|
||||
nsCOMPtr<nsIWidget> widget;
|
||||
view->GetOffsetFromWidget(&dx, &dy, *getter_AddRefs(widget));
|
||||
nsCOMPtr<nsIPrintPreviewContext> ppContext = do_QueryInterface(aPresContext);
|
||||
if (ppContext && widget) {
|
||||
if (ppContext && view->GetNearestWidget(nsnull)) {
|
||||
view->CreateWidget(kCChildCID);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1703,18 +1703,9 @@ nsComboboxControlFrame::ShowDropDown(PRBool aDoDropDown)
|
|||
}
|
||||
|
||||
if (!mDroppedDown && aDoDropDown) {
|
||||
// XXX Temporary for Bug 19416
|
||||
nsIView* lstView = mDropdownFrame->GetView();
|
||||
if (lstView) {
|
||||
lstView->IgnoreSetPosition(PR_FALSE);
|
||||
}
|
||||
if (mListControlFrame) {
|
||||
mListControlFrame->SyncViewWithFrame(mPresContext);
|
||||
}
|
||||
// XXX Temporary for Bug 19416
|
||||
if (lstView) {
|
||||
lstView->IgnoreSetPosition(PR_TRUE);
|
||||
}
|
||||
ToggleList(mPresContext);
|
||||
return NS_OK;
|
||||
} else if (mDroppedDown && !aDoDropDown) {
|
||||
|
|
|
@ -4072,13 +4072,6 @@ nsCSSFrameConstructor::ConstructSelectFrame(nsIPresShell* aPresShell,
|
|||
InitializeSelectFrame(aPresShell, aPresContext, aState, listFrame, scrolledFrame, aContent, comboboxFrame,
|
||||
listStyle, PR_FALSE, PR_FALSE, PR_TRUE);
|
||||
newFrame = listFrame;
|
||||
// XXX Temporary for Bug 19416
|
||||
{
|
||||
nsIView* lstView = scrolledFrame->GetView();
|
||||
if (lstView) {
|
||||
lstView->IgnoreSetPosition(PR_TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
// Set flag so the events go to the listFrame not child frames.
|
||||
// XXX: We should replace this with a real widget manager similar
|
||||
|
|
|
@ -559,14 +559,13 @@ nsMenuPopupFrame::AdjustClientXYForNestedDocuments ( nsIDOMXULDocument* inPopupD
|
|||
return;
|
||||
|
||||
// Find the widget associated with the popup's document
|
||||
nsCOMPtr<nsIWidget> popupDocumentWidget;
|
||||
nsIWidget* popupDocumentWidget = nsnull;
|
||||
nsIViewManager* viewManager = inPopupShell->GetViewManager();
|
||||
if ( viewManager ) {
|
||||
nsIView* rootView;
|
||||
viewManager->GetRootView(rootView);
|
||||
nscoord wOffsetX, wOffsetY;
|
||||
if ( rootView )
|
||||
rootView->GetOffsetFromWidget(&wOffsetX, &wOffsetY, *getter_AddRefs(popupDocumentWidget));
|
||||
popupDocumentWidget = rootView->GetNearestWidget(nsnull);
|
||||
}
|
||||
NS_WARN_IF_FALSE(popupDocumentWidget, "ACK, BAD WIDGET");
|
||||
|
||||
|
@ -610,8 +609,7 @@ nsMenuPopupFrame::AdjustClientXYForNestedDocuments ( nsIDOMXULDocument* inPopupD
|
|||
nsIView* rootViewTarget;
|
||||
viewManagerTarget->GetRootView(rootViewTarget);
|
||||
if ( rootViewTarget ) {
|
||||
nscoord unusedX, unusedY;
|
||||
rootViewTarget->GetOffsetFromWidget(&unusedX, &unusedY, *getter_AddRefs(targetDocumentWidget));
|
||||
targetDocumentWidget = rootViewTarget->GetNearestWidget(nsnull);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -133,16 +133,19 @@ public:
|
|||
* @param aManager view manager that "owns" the view. The view does NOT
|
||||
* hold a reference to the view manager
|
||||
* @param aBounds initial bounds for view
|
||||
* XXX We should eliminate this parameter; you can set the bounds after Init
|
||||
* @param aParent intended parent for view. this is not actually set in the
|
||||
* nsIView through this method. it is only used by the initialization
|
||||
* code to walk up the view tree, if necessary, to find resources.
|
||||
* XXX We should eliminate this parameter!
|
||||
* @param aVisibilityFlag initial visibility state of view
|
||||
* XXX We should eliminate this parameter; you can set it after Init
|
||||
* @result The result of the initialization, NS_OK if no errors
|
||||
*/
|
||||
NS_IMETHOD Init(nsIViewManager* aManager,
|
||||
nsresult Init(nsIViewManager* aManager,
|
||||
const nsRect &aBounds,
|
||||
const nsIView *aParent,
|
||||
nsViewVisibility aVisibilityFlag = nsViewVisibility_kShow) = 0;
|
||||
nsViewVisibility aVisibilityFlag = nsViewVisibility_kShow);
|
||||
|
||||
/**
|
||||
* Destroy the view.
|
||||
|
@ -154,7 +157,7 @@ public:
|
|||
* SetRootView(NULL) if the view is the root view and calling RemoveChild()
|
||||
* otherwise.
|
||||
*/
|
||||
NS_IMETHOD Destroy() = 0;
|
||||
void Destroy();
|
||||
|
||||
/**
|
||||
* Get the view manager which "owns" the view.
|
||||
|
@ -173,7 +176,6 @@ public:
|
|||
* @param y out parameter for y position
|
||||
*/
|
||||
nsPoint GetPosition() const {
|
||||
// this assertion should go away once we're confident that it's not needed
|
||||
NS_ASSERTION(!IsRoot() || (mPosX == 0 && mPosY == 0),
|
||||
"root views should always have explicit position of (0,0)");
|
||||
return nsPoint(mPosX, mPosY);
|
||||
|
@ -186,12 +188,7 @@ public:
|
|||
* if the view has content above or to the left of its origin.
|
||||
* @param aBounds out parameter for bounds
|
||||
*/
|
||||
nsRect GetBounds() const {
|
||||
// this assertion should go away once we're confident that it's not needed
|
||||
NS_ASSERTION(!IsRoot() || (mDimBounds.x == 0 && mDimBounds.y == 0),
|
||||
"root views should always have explicit position of (0,0)");
|
||||
return mDimBounds;
|
||||
}
|
||||
nsRect GetBounds() const { return mDimBounds; }
|
||||
|
||||
/**
|
||||
* Called to query the visibility state of a view.
|
||||
|
@ -248,6 +245,14 @@ public:
|
|||
*/
|
||||
float GetOpacity() const { return mOpacity; }
|
||||
|
||||
/**
|
||||
* Used to ask a view if it has any areas within its bounding box
|
||||
* that are transparent. This is not the same as opacity - opacity can
|
||||
* be set externally, transparency is a quality of the view itself.
|
||||
* @result Returns PR_TRUE if there are transparent areas, PR_FALSE otherwise.
|
||||
*/
|
||||
PRBool IsTransparent() const { return (mVFlags & NS_VIEW_FLAG_TRANSPARENT) != 0; }
|
||||
|
||||
/**
|
||||
* Indicate that this view is always painted onto a uniform field of pixels. Thus,
|
||||
* even if the view is transparent, it may still be bitblit scrollable because
|
||||
|
@ -269,7 +274,7 @@ public:
|
|||
* Set the view's link to client owned data.
|
||||
* @param aData - data to associate with view. nsnull to disassociate
|
||||
*/
|
||||
NS_IMETHOD SetClientData(void *aData) = 0;
|
||||
void SetClientData(void *aData) { mClientData = aData; }
|
||||
|
||||
/**
|
||||
* Query the view for it's link to client owned data.
|
||||
|
@ -279,16 +284,18 @@ public:
|
|||
|
||||
/**
|
||||
* Get the nearest widget in this view or a parent of this view and
|
||||
* the offset from the view that contains the widget to this view
|
||||
* @param aDx out parameter for x offset
|
||||
* @param aDy out parameter for y offset
|
||||
* @return widget (if there is one) closest to view
|
||||
* the offset from the widget's origin to this view's origin
|
||||
* @param aOffset the offset from this view's origin to the widget's origin
|
||||
* @return the widget closest to this view; can be null because some view trees
|
||||
* don't have widgets at all (e.g., printing), but if any view in the view tree
|
||||
* has a widget, then it's safe to assume this will not return null
|
||||
* XXX Remove this 'virtual' when gfx+widget are merged into gklayout;
|
||||
* Mac widget depends on this method, which is BOGUS!
|
||||
*/
|
||||
NS_IMETHOD GetOffsetFromWidget(nscoord *aDx, nscoord *aDy, nsIWidget *&aWidget) = 0;
|
||||
virtual nsIWidget* GetNearestWidget(nsPoint* aOffset);
|
||||
|
||||
/**
|
||||
* Create a widget to associate with this view. This is a helper
|
||||
* function for SetWidget.
|
||||
* Create a widget to associate with this view.
|
||||
* @param aWindowIID IID for Widget type that this view
|
||||
* should have associated with it. if nsull, then no
|
||||
* width will be created for this view
|
||||
|
@ -302,12 +309,12 @@ public:
|
|||
* assistive technology like screen readers.
|
||||
* @return error status
|
||||
*/
|
||||
NS_IMETHOD CreateWidget(const nsIID &aWindowIID,
|
||||
nsresult CreateWidget(const nsIID &aWindowIID,
|
||||
nsWidgetInitData *aWidgetInitData = nsnull,
|
||||
nsNativeWidget aNative = nsnull,
|
||||
PRBool aEnableDragDrop = PR_TRUE,
|
||||
PRBool aResetVisibility = PR_TRUE,
|
||||
nsContentType aWindowType = eContentTypeInherit) = 0;
|
||||
nsContentType aWindowType = eContentTypeInherit);
|
||||
|
||||
/**
|
||||
* In 4.0, the "cutout" nature of a view is queryable.
|
||||
|
@ -323,22 +330,20 @@ public:
|
|||
*/
|
||||
PRBool HasWidget() const { return mWindow != nsnull; }
|
||||
|
||||
// XXX Temporary for Bug #19416
|
||||
NS_IMETHOD IgnoreSetPosition(PRBool aShouldIgnore) = 0;
|
||||
|
||||
#ifdef DEBUG
|
||||
/**
|
||||
* Output debug info to FILE
|
||||
* @param out output file handle
|
||||
* @param aIndent indentation depth
|
||||
* NOTE: virtual so that debugging tools not linked into gklayout can access it
|
||||
*/
|
||||
NS_IMETHOD List(FILE* out, PRInt32 aIndent = 0) const = 0;
|
||||
virtual void List(FILE* out, PRInt32 aIndent = 0) const;
|
||||
#endif // DEBUG
|
||||
|
||||
/**
|
||||
* @result true iff this is the root view for its view manager
|
||||
*/
|
||||
virtual PRBool IsRoot() const = 0;
|
||||
PRBool IsRoot() const;
|
||||
|
||||
private:
|
||||
NS_IMETHOD_(nsrefcnt) AddRef(void) = 0;
|
||||
|
@ -357,6 +362,8 @@ protected:
|
|||
nsRect mDimBounds; // relative to parent
|
||||
float mOpacity;
|
||||
PRUint32 mVFlags;
|
||||
|
||||
virtual ~nsIView() {}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -380,15 +380,7 @@ NS_IMETHODIMP nsScrollPortView::GetScrollbarVisibility(PRBool *aVerticalVisible,
|
|||
|
||||
void nsScrollPortView::AdjustChildWidgets(nsScrollPortView *aScrolling, nsView *aView, nscoord aDx, nscoord aDy, float scale)
|
||||
{
|
||||
if (aScrolling == aView)
|
||||
{
|
||||
nsIWidget *widget;
|
||||
nscoord dx, dy;
|
||||
aScrolling->GetOffsetFromWidget(&dx, &dy, widget);
|
||||
aDx += dx;
|
||||
aDy += dy;
|
||||
NS_IF_RELEASE(widget);
|
||||
}
|
||||
NS_ASSERTION(aScrolling != aView, "We should only be scrolling children of aScrolling");
|
||||
|
||||
nsPoint pt = aView->GetPosition();
|
||||
|
||||
|
|
|
@ -217,7 +217,7 @@ nsView* nsView::GetViewFor(nsIWidget* aWidget)
|
|||
return nsnull;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsView::Init(nsIViewManager* aManager,
|
||||
nsresult nsIView::Init(nsIViewManager* aManager,
|
||||
const nsRect &aBounds,
|
||||
const nsIView *aParent,
|
||||
nsViewVisibility aVisibilityFlag)
|
||||
|
@ -233,31 +233,21 @@ NS_IMETHODIMP nsView::Init(nsIViewManager* aManager,
|
|||
// we don't hold a reference to the view manager
|
||||
mViewManager = NS_STATIC_CAST(nsViewManager*, aManager);
|
||||
|
||||
SetPosition(aBounds.x, aBounds.y);
|
||||
nsView* v = NS_STATIC_CAST(nsView*, this);
|
||||
v->SetPosition(aBounds.x, aBounds.y);
|
||||
nsRect dim(0, 0, aBounds.width, aBounds.height);
|
||||
v->SetDimensions(dim, PR_FALSE);
|
||||
v->SetVisibility(aVisibilityFlag);
|
||||
|
||||
SetDimensions(dim, PR_FALSE);
|
||||
|
||||
//temporarily set it...
|
||||
SetParent(NS_CONST_CAST(nsView*, NS_STATIC_CAST(const nsView*, aParent)));
|
||||
|
||||
SetVisibility(aVisibilityFlag);
|
||||
|
||||
// XXX Don't clear this or we hork the scrolling view when creating the clip
|
||||
// view's widget. It needs to stay set and later the view manager will reset it
|
||||
// when the view is inserted into the view hierarchy...
|
||||
#if 0
|
||||
//clear this again...
|
||||
SetParent(nsnull);
|
||||
#endif
|
||||
|
||||
// We shouldn't set the parent here. It should be set when we put this view
|
||||
// into the view hierarchy.
|
||||
v->SetParent(NS_STATIC_CAST(nsView*, NS_CONST_CAST(nsIView*, aParent)));
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsView::Destroy()
|
||||
void nsIView::Destroy()
|
||||
{
|
||||
delete this;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsView::Paint(nsIRenderingContext& rc, const nsRect& rect,
|
||||
|
@ -292,18 +282,6 @@ NS_IMETHODIMP nsView::Paint(nsIRenderingContext& rc, const nsIRegion& region,
|
|||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
// XXX Start Temporary fix for Bug #19416
|
||||
NS_IMETHODIMP nsView::IgnoreSetPosition(PRBool aShouldIgnore)
|
||||
{
|
||||
mShouldIgnoreSetPosition = aShouldIgnore;
|
||||
// resync here
|
||||
if (!mShouldIgnoreSetPosition) {
|
||||
SetPosition(mPosX, mPosY);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
// XXX End Temporary fix for Bug #19416
|
||||
|
||||
void nsView::SetPosition(nscoord aX, nscoord aY)
|
||||
{
|
||||
mDimBounds.x += aX - mPosX;
|
||||
|
@ -311,12 +289,9 @@ void nsView::SetPosition(nscoord aX, nscoord aY)
|
|||
mPosX = aX;
|
||||
mPosY = aY;
|
||||
|
||||
// XXX Start Temporary fix for Bug #19416
|
||||
if (mShouldIgnoreSetPosition) {
|
||||
return;
|
||||
}
|
||||
NS_ASSERTION(GetParent() || (aX == 0 && aY == 0),
|
||||
"Don't try to move the root widget to something non-zero");
|
||||
|
||||
// XXX End Temporary fix for Bug #19416
|
||||
ResetWidgetPosition(PR_TRUE);
|
||||
}
|
||||
|
||||
|
@ -345,18 +320,18 @@ void nsView::ResetWidgetPosition(PRBool aRecurse) {
|
|||
|
||||
nsIDeviceContext *dx;
|
||||
float scale;
|
||||
nsIWidget *pwidget = nsnull;
|
||||
nscoord parx = 0, pary = 0;
|
||||
|
||||
mViewManager->GetDeviceContext(dx);
|
||||
dx->GetAppUnitsToDevUnits(scale);
|
||||
NS_RELEASE(dx);
|
||||
|
||||
GetOffsetFromWidget(&parx, &pary, pwidget);
|
||||
NS_IF_RELEASE(pwidget);
|
||||
nsPoint offset(0, 0);
|
||||
if (GetParent()) {
|
||||
GetParent()->GetNearestWidget(&offset);
|
||||
}
|
||||
|
||||
mWindow->Move(NSTwipsToIntPixels((mDimBounds.x + parx), scale),
|
||||
NSTwipsToIntPixels((mDimBounds.y + pary), scale));
|
||||
mWindow->Move(NSTwipsToIntPixels((mDimBounds.x + offset.x), scale),
|
||||
NSTwipsToIntPixels((mDimBounds.y + offset.y), scale));
|
||||
} else if (aRecurse) {
|
||||
// reposition any widgets under this view
|
||||
for (nsView* v = GetFirstChild(); v; v = v->GetNextSibling()) {
|
||||
|
@ -376,40 +351,6 @@ NS_IMETHODIMP nsView::SynchWidgetSizePosition()
|
|||
mViewManager->GetDeviceContext(dx);
|
||||
dx->GetAppUnitsToDevUnits(t2p);
|
||||
NS_RELEASE(dx);
|
||||
#if 0
|
||||
/* You would think that doing a move and resize all in one operation would
|
||||
* be faster but its not. Something is really broken here. So I'm comenting
|
||||
* this out for now
|
||||
*/
|
||||
// if we moved and resized do it all in one shot
|
||||
if (mVFlags & NS_VIEW_PUBLIC_FLAG_WIDGET_MOVED && mVFlags & NS_VIEW_PUBLIC_FLAG_WIDGET_RESIZED)
|
||||
{
|
||||
|
||||
nscoord parx = 0, pary = 0;
|
||||
nsIWidget *pwidget = nsnull;
|
||||
|
||||
GetOffsetFromWidget(&parx, &pary, pwidget);
|
||||
NS_IF_RELEASE(pwidget);
|
||||
|
||||
PRInt32 x = NSTwipsToIntPixels(mDimBounds.x + parx, t2p);
|
||||
PRInt32 y = NSTwipsToIntPixels(mDimBounds.y + pary, t2p);
|
||||
PRInt32 width = NSTwipsToIntPixels(mDimBounds.width, t2p);
|
||||
PRInt32 height = NSTwipsToIntPixels(mDimBounds.height, t2p);
|
||||
|
||||
nsRect bounds;
|
||||
mWindow->GetBounds(bounds);
|
||||
if (bounds.x == x && bounds.y == y )
|
||||
mVFlags &= ~NS_VIEW_FLAG_WIDGET_MOVED;
|
||||
else if (bounds.width == width && bounds.height == bounds.height)
|
||||
mVFlags &= ~NS_VIEW_FLAG_WIDGET_RESIZED;
|
||||
else {
|
||||
mWindow->Resize(x,y,width,height, PR_TRUE);
|
||||
mVFlags &= ~NS_VIEW_FLAG_WIDGET_RESIZED;
|
||||
mVFlags &= ~NS_VIEW_FLAG_WIDGET_MOVED;
|
||||
return NS_OK;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
// if we just resized do it
|
||||
if (mVFlags & NS_VIEW_FLAG_WIDGET_RESIZED)
|
||||
{
|
||||
|
@ -421,9 +362,6 @@ NS_IMETHODIMP nsView::SynchWidgetSizePosition()
|
|||
mWindow->GetBounds(bounds);
|
||||
|
||||
if (bounds.width != width || bounds.height != bounds.height) {
|
||||
#ifdef DEBUG_evaughan
|
||||
printf("%d) Resize(%d,%d)\n", this, width, height);
|
||||
#endif
|
||||
mWindow->Resize(width,height, PR_TRUE);
|
||||
}
|
||||
|
||||
|
@ -432,22 +370,16 @@ NS_IMETHODIMP nsView::SynchWidgetSizePosition()
|
|||
|
||||
if (mVFlags & NS_VIEW_FLAG_WIDGET_MOVED) {
|
||||
// if we just moved do it.
|
||||
nscoord parx = 0, pary = 0;
|
||||
nsIWidget *pwidget = nsnull;
|
||||
nsPoint offset;
|
||||
GetParent()->GetNearestWidget(&offset);
|
||||
|
||||
GetOffsetFromWidget(&parx, &pary, pwidget);
|
||||
NS_IF_RELEASE(pwidget);
|
||||
|
||||
PRInt32 x = NSTwipsToIntPixels(mDimBounds.x + parx, t2p);
|
||||
PRInt32 y = NSTwipsToIntPixels(mDimBounds.y + pary, t2p);
|
||||
PRInt32 x = NSTwipsToIntPixels(mDimBounds.x + offset.x, t2p);
|
||||
PRInt32 y = NSTwipsToIntPixels(mDimBounds.y + offset.y, t2p);
|
||||
|
||||
nsRect bounds;
|
||||
mWindow->GetBounds(bounds);
|
||||
|
||||
if (bounds.x != x || bounds.y != y) {
|
||||
#ifdef DEBUG_evaughan
|
||||
printf("%d) Move(%d,%d)\n", this, x, y);
|
||||
#endif
|
||||
mWindow->Move(x,y);
|
||||
}
|
||||
|
||||
|
@ -488,18 +420,18 @@ void nsView::SetDimensions(const nsRect& aRect, PRBool aPaint)
|
|||
|
||||
nsIDeviceContext *dx;
|
||||
float t2p;
|
||||
nsIWidget *pwidget = nsnull;
|
||||
nscoord parx = 0, pary = 0;
|
||||
|
||||
mViewManager->GetDeviceContext(dx);
|
||||
dx->GetAppUnitsToDevUnits(t2p);
|
||||
|
||||
GetOffsetFromWidget(&parx, &pary, pwidget);
|
||||
NS_IF_RELEASE(pwidget);
|
||||
|
||||
if (needToMoveWidget) {
|
||||
mWindow->Move(NSTwipsToIntPixels((mDimBounds.x + parx), t2p),
|
||||
NSTwipsToIntPixels((mDimBounds.y + pary), t2p));
|
||||
NS_ASSERTION(GetParent(), "Don't try to move the root widget, dude");
|
||||
|
||||
nsPoint offset;
|
||||
GetParent()->GetNearestWidget(&offset);
|
||||
|
||||
mWindow->Move(NSTwipsToIntPixels((mDimBounds.x + offset.x), t2p),
|
||||
NSTwipsToIntPixels((mDimBounds.y + offset.y), t2p));
|
||||
}
|
||||
mWindow->Resize(NSTwipsToIntPixels(mDimBounds.width, t2p), NSTwipsToIntPixels(mDimBounds.height, t2p),
|
||||
aPaint);
|
||||
|
@ -606,12 +538,6 @@ NS_IMETHODIMP nsView::SetOpacity(float opacity)
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsView::HasTransparency(PRBool &aTransparent) const
|
||||
{
|
||||
aTransparent = (mVFlags & NS_VIEW_FLAG_TRANSPARENT) ? PR_TRUE : PR_FALSE;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsView::SetContentTransparency(PRBool aTransparent)
|
||||
{
|
||||
if (aTransparent == PR_TRUE)
|
||||
|
@ -622,13 +548,7 @@ NS_IMETHODIMP nsView::SetContentTransparency(PRBool aTransparent)
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsView::SetClientData(void *aData)
|
||||
{
|
||||
mClientData = aData;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsView::CreateWidget(const nsIID &aWindowIID,
|
||||
nsresult nsIView::CreateWidget(const nsIID &aWindowIID,
|
||||
nsWidgetInitData *aWidgetInitData,
|
||||
nsNativeWidget aNative,
|
||||
PRBool aEnableDragDrop,
|
||||
|
@ -646,7 +566,8 @@ NS_IMETHODIMP nsView::CreateWidget(const nsIID &aWindowIID,
|
|||
|
||||
trect *= scale;
|
||||
|
||||
if (NS_OK == LoadWidget(aWindowIID))
|
||||
nsView* v = NS_STATIC_CAST(nsView*, this);
|
||||
if (NS_OK == v->LoadWidget(aWindowIID))
|
||||
{
|
||||
PRBool usewidgets;
|
||||
|
||||
|
@ -673,11 +594,10 @@ NS_IMETHODIMP nsView::CreateWidget(const nsIID &aWindowIID,
|
|||
GetParent()->GetViewManager() != mViewManager)
|
||||
initData.mListenForResizes = PR_TRUE;
|
||||
|
||||
nsIWidget *parent;
|
||||
GetOffsetFromWidget(nsnull, nsnull, parent);
|
||||
|
||||
mWindow->Create(parent, trect, ::HandleEvent, dx, nsnull, nsnull, aWidgetInitData);
|
||||
NS_IF_RELEASE(parent);
|
||||
nsIWidget* parentWidget = GetParent() ? GetParent()->GetNearestWidget(nsnull)
|
||||
: nsnull;
|
||||
mWindow->Create(parentWidget, trect,
|
||||
::HandleEvent, dx, nsnull, nsnull, aWidgetInitData);
|
||||
}
|
||||
if (aEnableDragDrop) {
|
||||
mWindow->EnableDragDrop(PR_TRUE);
|
||||
|
@ -691,7 +611,7 @@ NS_IMETHODIMP nsView::CreateWidget(const nsIID &aWindowIID,
|
|||
//make sure visibility state is accurate
|
||||
|
||||
if (aResetVisibility) {
|
||||
SetVisibility(GetVisibility());
|
||||
v->SetVisibility(GetVisibility());
|
||||
}
|
||||
|
||||
NS_RELEASE(dx);
|
||||
|
@ -740,7 +660,7 @@ nsresult nsView::LoadWidget(const nsCID &aClassIID)
|
|||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
NS_IMETHODIMP nsView::List(FILE* out, PRInt32 aIndent) const
|
||||
void nsIView::List(FILE* out, PRInt32 aIndent) const
|
||||
{
|
||||
PRInt32 i;
|
||||
for (i = aIndent; --i >= 0; ) fputs(" ", out);
|
||||
|
@ -767,66 +687,48 @@ NS_IMETHODIMP nsView::List(FILE* out, PRInt32 aIndent) const
|
|||
nsRect brect = GetBounds();
|
||||
fprintf(out, "{%d,%d,%d,%d}",
|
||||
brect.x, brect.y, brect.width, brect.height);
|
||||
if (IsZPlaceholderView()) {
|
||||
const nsView* v = NS_STATIC_CAST(const nsView*, this);
|
||||
if (v->IsZPlaceholderView()) {
|
||||
fprintf(out, " z-placeholder(%p)",
|
||||
(void*)NS_STATIC_CAST(const nsZPlaceholderView*, this)->GetReparentedView());
|
||||
}
|
||||
if (mZParent) {
|
||||
fprintf(out, " zparent=%p", (void*)mZParent);
|
||||
if (v->GetZParent()) {
|
||||
fprintf(out, " zparent=%p", (void*)v->GetZParent());
|
||||
}
|
||||
PRBool hasTransparency;
|
||||
HasTransparency(hasTransparency);
|
||||
fprintf(out, " z=%d vis=%d opc=%1.3f tran=%d clientData=%p <\n",
|
||||
mZIndex, mVis, mOpacity, hasTransparency, mClientData);
|
||||
mZIndex, mVis, mOpacity, IsTransparent(), mClientData);
|
||||
for (nsView* kid = mFirstChild; kid; kid = kid->GetNextSibling()) {
|
||||
NS_ASSERTION(kid->GetParent() == this, "incorrect parent");
|
||||
kid->List(out, aIndent + 1);
|
||||
}
|
||||
for (i = aIndent; --i >= 0; ) fputs(" ", out);
|
||||
fputs(">\n", out);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
#endif // DEBUG
|
||||
|
||||
NS_IMETHODIMP nsView::GetOffsetFromWidget(nscoord *aDx, nscoord *aDy, nsIWidget *&aWidget)
|
||||
nsIWidget* nsIView::GetNearestWidget(nsPoint* aOffset)
|
||||
{
|
||||
nsView *ancestor = GetParent();
|
||||
aWidget = nsnull;
|
||||
|
||||
if (aDx) *aDx = 0;
|
||||
if (aDy) *aDy = 0;
|
||||
while (ancestor)
|
||||
{
|
||||
aWidget = ancestor->GetWidget();
|
||||
if (aWidget) {
|
||||
NS_ADDREF(aWidget);
|
||||
// the widget's (0,0) is at the top left of the view's bounds, NOT its position
|
||||
if (aDx && aDy)
|
||||
{
|
||||
nsRect r;
|
||||
ancestor->GetDimensions(r);
|
||||
*aDx -= r.x;
|
||||
*aDy -= r.y;
|
||||
nsPoint pt(0, 0);
|
||||
nsView* v;
|
||||
for (v = NS_STATIC_CAST(nsView*, this);
|
||||
v && !v->HasWidget(); v = v->GetParent()) {
|
||||
pt += v->GetPosition();
|
||||
}
|
||||
return NS_OK;
|
||||
if (!v) {
|
||||
if (aOffset) {
|
||||
*aOffset = pt;
|
||||
}
|
||||
return NS_STATIC_CAST(nsView*, this)->GetViewManager()->GetWidget();
|
||||
}
|
||||
|
||||
if (aDx && aDy)
|
||||
{
|
||||
ancestor->ConvertToParentCoords(aDx, aDy);
|
||||
// pt is now the offset from v's origin to this's origin
|
||||
// The widget's origin is the top left corner of v's bounds, which may
|
||||
// not coincide with v's origin
|
||||
if (aOffset) {
|
||||
nsRect vBounds = v->GetBounds();
|
||||
*aOffset = pt + v->GetPosition() - nsPoint(vBounds.x, vBounds.y);
|
||||
}
|
||||
|
||||
ancestor = ancestor->GetParent();
|
||||
}
|
||||
|
||||
if (nsnull == aWidget) {
|
||||
// The root view doesn't have a widget
|
||||
// but maybe the view manager does.
|
||||
GetViewManager()->GetWidget(&aWidget);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
return v->GetWidget();
|
||||
}
|
||||
|
||||
nsresult nsView::GetDirtyRegion(nsIRegion*& aRegion)
|
||||
|
@ -842,7 +744,7 @@ nsresult nsView::GetDirtyRegion(nsIRegion*& aRegion)
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
PRBool nsView::IsRoot() const
|
||||
PRBool nsIView::IsRoot() const
|
||||
{
|
||||
NS_ASSERTION(mViewManager != nsnull," View manager is null in nsView::IsRoot()");
|
||||
return mViewManager->GetRootView() == this;
|
||||
|
|
|
@ -77,31 +77,6 @@ public:
|
|||
// nsISupports
|
||||
NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr);
|
||||
|
||||
// nsIView
|
||||
NS_IMETHOD Init(nsIViewManager* aManager,
|
||||
const nsRect &aBounds,
|
||||
const nsIView *aParent,
|
||||
nsViewVisibility aVisibilityFlag = nsViewVisibility_kShow);
|
||||
/**
|
||||
* Used to ask a view if it has any areas within its bounding box
|
||||
* that are transparent. This is not the same as opacity - opacity can
|
||||
* be set externally, transparency is a quality of the view itself.
|
||||
* @result Returns PR_TRUE if there are transparent areas, PR_FALSE otherwise.
|
||||
*/
|
||||
NS_IMETHOD HasTransparency(PRBool &aTransparent) const;
|
||||
NS_IMETHOD SetClientData(void *aData);
|
||||
NS_IMETHOD GetOffsetFromWidget(nscoord *aDx, nscoord *aDy, nsIWidget *&aWidget);
|
||||
NS_IMETHOD CreateWidget(const nsIID &aWindowIID,
|
||||
nsWidgetInitData *aWidgetInitData = nsnull,
|
||||
nsNativeWidget aNative = nsnull,
|
||||
PRBool aEnableDragDrop = PR_TRUE,
|
||||
PRBool aResetVisibility = PR_TRUE,
|
||||
nsContentType aContentType = eContentTypeInherit);
|
||||
#ifdef DEBUG
|
||||
NS_IMETHOD List(FILE* out = stdout, PRInt32 aIndent = 0) const;
|
||||
#endif
|
||||
|
||||
NS_IMETHOD Destroy();
|
||||
/**
|
||||
* Called to indicate that the specified rect of the view
|
||||
* needs to be drawn via the rendering context. The rect
|
||||
|
@ -228,9 +203,6 @@ public:
|
|||
NS_IMETHOD GetClippedRect(nsRect& aClippedRect, PRBool& aIsClipped, PRBool& aEmpty) const;
|
||||
|
||||
|
||||
// XXX Temporary for Bug #19416
|
||||
NS_IMETHOD IgnoreSetPosition(PRBool aShouldIgnore);
|
||||
|
||||
/**
|
||||
* Sync your widget size and position with the view
|
||||
*/
|
||||
|
@ -240,9 +212,6 @@ public:
|
|||
// Helper function to get the view that's associated with a widget
|
||||
static nsView* GetViewFor(nsIWidget* aWidget);
|
||||
|
||||
// Helper function to determine if the view instance is the root view
|
||||
virtual PRBool IsRoot() const;
|
||||
|
||||
// Helper function to determine if the view point is inside of a view
|
||||
PRBool PointIsInside(nsView& aView, nscoord x, nscoord y) const;
|
||||
|
||||
|
@ -284,10 +253,10 @@ public:
|
|||
void ConvertFromParentCoords(nscoord* aX, nscoord* aY) const { *aX -= mPosX; *aY -= mPosY; }
|
||||
void ResetWidgetPosition(PRBool aRecurse);
|
||||
void SetPositionIgnoringChildWidgets(nscoord aX, nscoord aY);
|
||||
nsresult LoadWidget(const nsCID &aClassIID);
|
||||
|
||||
protected:
|
||||
virtual ~nsView();
|
||||
virtual nsresult LoadWidget(const nsCID &aClassIID);
|
||||
|
||||
protected:
|
||||
nsZPlaceholderView*mZParent;
|
||||
|
@ -295,8 +264,6 @@ protected:
|
|||
//XXX should there be pointers to last child so backward walking is fast?
|
||||
nsRect mChildClip;
|
||||
nsIRegion* mDirtyRegion;
|
||||
// Bug #19416
|
||||
PRPackedBool mShouldIgnoreSetPosition;
|
||||
PRPackedBool mChildRemoved;
|
||||
|
||||
private:
|
||||
|
|
|
@ -3013,11 +3013,8 @@ NS_IMETHODIMP nsViewManager::SetViewZIndex(nsIView *aView, PRBool aAutoZIndex, P
|
|||
NS_IMETHODIMP nsViewManager::SetViewContentTransparency(nsIView *aView, PRBool aTransparent)
|
||||
{
|
||||
nsView* view = NS_STATIC_CAST(nsView*, aView);
|
||||
PRBool trans;
|
||||
|
||||
view->HasTransparency(trans);
|
||||
|
||||
if (trans != aTransparent) {
|
||||
if (view->IsTransparent() != aTransparent) {
|
||||
view->SetContentTransparency(aTransparent);
|
||||
|
||||
if (IsViewInserted(view)) {
|
||||
|
@ -3502,10 +3499,8 @@ PRBool nsViewManager::CreateDisplayList(nsView *aView, PRBool aReparentedViewsPr
|
|||
bounds.y -= aOriginY;
|
||||
|
||||
if (aEventProcessing || aView->GetOpacity() > 0.0f) {
|
||||
PRBool transparent;
|
||||
aView->HasTransparency(transparent);
|
||||
PRUint32 flags = VIEW_RENDERED;
|
||||
if (transparent)
|
||||
if (aView->IsTransparent())
|
||||
flags |= VIEW_TRANSPARENT;
|
||||
retval = AddToDisplayList(aView, aResult, bounds, irect, flags,
|
||||
aX - aOriginX, aY - aOriginY,
|
||||
|
@ -3744,9 +3739,7 @@ nsRect nsViewManager::OptimizeTranslucentRegions(
|
|||
r.UnionRect(r, element->mBounds);
|
||||
// the bounds of a non-transparent element are added to the opaque
|
||||
// region
|
||||
PRBool transparent;
|
||||
element->mView->HasTransparency(transparent);
|
||||
if (!transparent && aOpaqueRegion) {
|
||||
if (!element->mView->IsTransparent() && aOpaqueRegion) {
|
||||
aOpaqueRegion->Or(*aOpaqueRegion, element->mBounds);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -202,6 +202,7 @@ public:
|
|||
|
||||
NS_IMETHOD GetWidgetForView(nsIView *aView, nsIWidget **aWidget);
|
||||
NS_IMETHOD GetWidget(nsIWidget **aWidget);
|
||||
nsIWidget* GetWidget() { return mRootWindow; }
|
||||
NS_IMETHOD ForceUpdate();
|
||||
|
||||
NS_IMETHOD IsCachingWidgetChanges(PRBool* aCaching);
|
||||
|
|
|
@ -157,7 +157,6 @@ nsDragService::ComputeGlobalRectFromFrame ( nsIDOMNode* aDOMNode, Rect & outScre
|
|||
}
|
||||
#endif
|
||||
|
||||
PRBool haveRectFlag = PR_FALSE;
|
||||
outScreenRect.left = outScreenRect.right = outScreenRect.top = outScreenRect.bottom = 0;
|
||||
|
||||
// Get the frame for this content node (note: frames are not refcounted)
|
||||
|
@ -183,24 +182,19 @@ nsDragService::ComputeGlobalRectFromFrame ( nsIDOMNode* aDOMNode, Rect & outScre
|
|||
return PR_FALSE;
|
||||
|
||||
// get the widget associated with the containing view.
|
||||
nsCOMPtr<nsIWidget> aWidget;
|
||||
nscoord widgetOffsetX = 0, widgetOffsetY = 0;
|
||||
containingView->GetOffsetFromWidget ( &widgetOffsetX, &widgetOffsetY, *getter_AddRefs(aWidget) );
|
||||
if (aWidget) {
|
||||
nsPoint widgetOffset;
|
||||
nsIWidget* aWidget = containingView->GetNearestWidget ( &widgetOffset );
|
||||
|
||||
float t2p = 1.0;
|
||||
presContext->GetTwipsToPixels(&t2p);
|
||||
|
||||
// GetOffsetFromWidget() actually returns the _parent's_ offset from its widget, so we
|
||||
// still have to add in the offset to |containingView|'s parent ourselves.
|
||||
nsPoint viewOffsetToParent = containingView->GetPosition();
|
||||
|
||||
// Shift our offset rect by offset into our view, the view's offset to its parent, and
|
||||
// the parent's offset to the closest widget. Then convert that to global coordinates.
|
||||
// Shift our offset rect by offset into our view, and
|
||||
// the view's offset to the closest widget. Then convert that to global coordinates.
|
||||
// Recall that WidgetToScreen() will give us the global coordinates of the rectangle we
|
||||
// give it, but it expects everything to be in pixels.
|
||||
nsRect screenOffset;
|
||||
screenOffset.MoveBy ( NSTwipsToIntPixels(widgetOffsetX + viewOffsetToParent.x + viewOffset.x, t2p),
|
||||
NSTwipsToIntPixels(widgetOffsetY + viewOffsetToParent.y + viewOffset.y, t2p) );
|
||||
screenOffset.MoveBy ( NSTwipsToIntPixels(widgetOffset.x + viewOffset.x, t2p),
|
||||
NSTwipsToIntPixels(widgetOffset.y + viewOffset.y, t2p) );
|
||||
aWidget->WidgetToScreen ( screenOffset, screenOffset );
|
||||
|
||||
// stash it all in a mac rect
|
||||
|
@ -209,11 +203,7 @@ nsDragService::ComputeGlobalRectFromFrame ( nsIDOMNode* aDOMNode, Rect & outScre
|
|||
outScreenRect.right = outScreenRect.left + NSTwipsToIntPixels(rect.width, t2p);
|
||||
outScreenRect.bottom = outScreenRect.top + NSTwipsToIntPixels(rect.height, t2p);
|
||||
|
||||
haveRectFlag = PR_TRUE;
|
||||
}
|
||||
|
||||
return haveRectFlag;
|
||||
|
||||
return PR_TRUE;
|
||||
} // ComputeGlobalRectFromFrame
|
||||
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче