1
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* ***** BEGIN LICENSE BLOCK *****
3
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
5
* The contents of this file are subject to the Mozilla Public License Version
6
* 1.1 (the "License"); you may not use this file except in compliance with
7
* the License. You may obtain a copy of the License at
8
* http://www.mozilla.org/MPL/
10
* Software distributed under the License is distributed on an "AS IS" basis,
11
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12
* for the specific language governing rights and limitations under the
15
* The Original Code is Mozilla Communicator client code.
17
* The Initial Developer of the Original Code is
18
* Netscape Communications Corporation.
19
* Portions created by the Initial Developer are Copyright (C) 1998
20
* the Initial Developer. All Rights Reserved.
24
* Alternatively, the contents of this file may be used under the terms of
25
* either of the GNU General Public License Version 2 or later (the "GPL"),
26
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27
* in which case the provisions of the GPL or the LGPL are applicable instead
28
* of those above. If you wish to allow use of your version of this file only
29
* under the terms of either the GPL or the LGPL, and not to allow others to
30
* use your version of this file under the terms of the MPL, indicate your
31
* decision by deleting the provisions above and replace them with the notice
32
* and other provisions required by the GPL or the LGPL. If you do not delete
33
* the provisions above, a recipient may use your version of this file under
34
* the terms of any one of the MPL, the GPL or the LGPL.
36
* ***** END LICENSE BLOCK ***** */
39
// David Hyatt & Eric Vaughan
40
// Netscape Communications
42
// See documentation in associated header file
45
#include "nsProgressMeterFrame.h"
46
#include "nsCSSRendering.h"
47
#include "nsIContent.h"
48
#include "nsPresContext.h"
49
#include "nsGkAtoms.h"
50
#include "nsINameSpaceManager.h"
52
#include "nsBoxLayoutState.h"
53
#include "nsIReflowCallback.h"
57
// Creates a new Toolbar frame and returns it
60
NS_NewProgressMeterFrame (nsIPresShell* aPresShell, nsStyleContext* aContext)
62
return new (aPresShell) nsProgressMeterFrame(aPresShell, aContext);
63
} // NS_NewProgressMeterFrame
66
// nsProgressMeterFrame dstr
68
// Cleanup, if necessary
70
nsProgressMeterFrame :: ~nsProgressMeterFrame ( )
74
class nsAsyncProgressMeterInit : public nsIReflowCallback
77
nsAsyncProgressMeterInit(nsIFrame* aFrame) : mWeakFrame(aFrame) {}
79
virtual PRBool ReflowFinished()
81
PRBool shouldFlush = PR_FALSE;
82
nsIFrame* frame = mWeakFrame.GetFrame();
84
frame->AttributeChanged(kNameSpaceID_None, nsGkAtoms::value, 0);
85
shouldFlush = PR_TRUE;
91
virtual void ReflowCallbackCanceled()
96
nsWeakFrame mWeakFrame;
100
nsProgressMeterFrame::DoLayout(nsBoxLayoutState& aState)
102
if (mNeedsReflowCallback) {
103
nsIReflowCallback* cb = new nsAsyncProgressMeterInit(this);
105
PresContext()->PresShell()->PostReflowCallback(cb);
107
mNeedsReflowCallback = PR_FALSE;
109
return nsBoxFrame::DoLayout(aState);
113
nsProgressMeterFrame::AttributeChanged(PRInt32 aNameSpaceID,
117
nsresult rv = nsBoxFrame::AttributeChanged(aNameSpaceID, aAttribute,
123
// did the progress change?
124
if (nsGkAtoms::value == aAttribute) {
125
nsIFrame* barChild = GetFirstChild(nsnull);
126
if (!barChild) return NS_OK;
127
nsIFrame* remainderChild = barChild->GetNextSibling();
128
if (!remainderChild) return NS_OK;
129
nsCOMPtr<nsIContent> remainderContent = remainderChild->GetContent();
130
if (!remainderContent) return NS_OK;
133
mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::value, value);
136
PRInt32 flex = value.ToInteger(&error);
137
if (flex < 0) flex = 0;
138
if (flex > 100) flex = 100;
140
PRInt32 remainder = 100 - flex;
142
nsAutoString leftFlex, rightFlex;
143
leftFlex.AppendInt(flex);
144
rightFlex.AppendInt(remainder);
145
nsWeakFrame weakFrame(this);
146
barChild->GetContent()->SetAttr(kNameSpaceID_None, nsGkAtoms::flex, leftFlex, PR_TRUE);
147
remainderContent->SetAttr(kNameSpaceID_None, nsGkAtoms::flex, rightFlex, PR_TRUE);
149
if (weakFrame.IsAlive()) {
150
PresContext()->PresShell()->
151
FrameNeedsReflow(this, nsIPresShell::eTreeChange, NS_FRAME_IS_DIRTY);
159
nsProgressMeterFrame::GetFrameName(nsAString& aResult) const
161
return MakeFrameName(NS_LITERAL_STRING("ProgressMeter"), aResult);