This commit was manufactured by cvs2svn to create branch

'GECKO181_20070712_RELBRANCH'.

git-svn-id: svn://10.0.0.236/branches/GECKO181_20070712_RELBRANCH@229835 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
(no author)
2007-07-12 20:09:09 +00:00
parent c897865b5d
commit 3afdd87a67
546 changed files with 13726 additions and 5336 deletions

View File

@@ -91,6 +91,8 @@ void nsAccessibleHyperText::Shutdown()
PRBool nsAccessibleHyperText::GetAllTextChildren(nsPresContext *aPresContext, nsIFrame *aCurFrame, nsIDOMNode* aNode, PRBool &bSave)
{
NS_ENSURE_TRUE(mTextChildren, PR_FALSE);
while (aCurFrame) {
nsIAtom* frameType = aCurFrame->GetType();
@@ -143,6 +145,8 @@ PRInt32 nsAccessibleHyperText::GetIndex()
nsIDOMNode* nsAccessibleHyperText::FindTextNodeByOffset(PRInt32 aOffset, PRInt32& aBeforeLength)
{
NS_ENSURE_TRUE(mTextChildren, nsnull);
aBeforeLength = 0;
PRUint32 index, count;
@@ -183,6 +187,8 @@ nsresult nsAccessibleHyperText::GetTextHelper(EGetTextType aType, nsAccessibleTe
/* attribute long caretOffset; */
NS_IMETHODIMP nsAccessibleHyperText::GetCaretOffset(PRInt32 *aCaretOffset)
{
NS_ENSURE_TRUE(mTextChildren, NS_ERROR_FAILURE);
*aCaretOffset = 0;
PRInt32 charCount, caretOffset;
@@ -209,6 +215,8 @@ NS_IMETHODIMP nsAccessibleHyperText::GetCaretOffset(PRInt32 *aCaretOffset)
NS_IMETHODIMP nsAccessibleHyperText::SetCaretOffset(PRInt32 aCaretOffset)
{
NS_ENSURE_TRUE(mTextChildren, NS_ERROR_FAILURE);
PRInt32 beforeLength;
nsIDOMNode* domNode = FindTextNodeByOffset(aCaretOffset, beforeLength);
if (domNode) {
@@ -222,6 +230,8 @@ NS_IMETHODIMP nsAccessibleHyperText::SetCaretOffset(PRInt32 aCaretOffset)
/* readonly attribute long characterCount; */
NS_IMETHODIMP nsAccessibleHyperText::GetCharacterCount(PRInt32 *aCharacterCount)
{
NS_ENSURE_TRUE(mTextChildren, NS_ERROR_FAILURE);
*aCharacterCount = 0;
PRInt32 charCount;
@@ -240,6 +250,8 @@ NS_IMETHODIMP nsAccessibleHyperText::GetCharacterCount(PRInt32 *aCharacterCount)
/* readonly attribute long selectionCount; */
NS_IMETHODIMP nsAccessibleHyperText::GetSelectionCount(PRInt32 *aSelectionCount)
{
NS_ENSURE_TRUE(mTextChildren, NS_ERROR_FAILURE);
*aSelectionCount = 0;
PRInt32 selCount;
@@ -258,6 +270,8 @@ NS_IMETHODIMP nsAccessibleHyperText::GetSelectionCount(PRInt32 *aSelectionCount)
/* AString getText (in long startOffset, in long endOffset); */
NS_IMETHODIMP nsAccessibleHyperText::GetText(PRInt32 aStartOffset, PRInt32 aEndOffset, nsAString & aText)
{
NS_ENSURE_TRUE(mTextChildren, NS_ERROR_FAILURE);
if (aEndOffset == -1)
GetCharacterCount(&aEndOffset);
@@ -392,6 +406,8 @@ NS_IMETHODIMP nsAccessibleHyperText::RemoveSelection(PRInt32 aSelectionNum)
// ------- nsIAccessibleHyperText ---------------
/* readonly attribute long links; */NS_IMETHODIMP nsAccessibleHyperText::GetLinks(PRInt32 *aLinks)
{
NS_ENSURE_TRUE(mTextChildren, NS_ERROR_FAILURE);
*aLinks = 0;
PRUint32 index, count;
@@ -409,6 +425,8 @@ NS_IMETHODIMP nsAccessibleHyperText::RemoveSelection(PRInt32 aSelectionNum)
/* nsIAccessibleHyperLink getLink (in long index); */
NS_IMETHODIMP nsAccessibleHyperText::GetLink(PRInt32 aIndex, nsIAccessibleHyperLink **aLink)
{
NS_ENSURE_TRUE(mTextChildren, NS_ERROR_FAILURE);
PRUint32 index, count, linkCount = 0;
mTextChildren->GetLength(&count);
for (index = 0; index < count; index++) {
@@ -456,6 +474,8 @@ NS_IMETHODIMP nsAccessibleHyperText::GetLink(PRInt32 aIndex, nsIAccessibleHyperL
/* long getLinkIndex (in long charIndex); */
NS_IMETHODIMP nsAccessibleHyperText::GetLinkIndex(PRInt32 aCharIndex, PRInt32 *aLinkIndex)
{
NS_ENSURE_TRUE(mTextChildren, NS_ERROR_FAILURE);
*aLinkIndex = -1;
PRInt32 beforeLength_unused;
PRUint32 nodeIndex;
@@ -476,6 +496,8 @@ NS_IMETHODIMP nsAccessibleHyperText::GetLinkIndex(PRInt32 aCharIndex, PRInt32 *a
/* long getSelectedLinkIndex (); */
NS_IMETHODIMP nsAccessibleHyperText::GetSelectedLinkIndex(PRInt32 *aSelectedLinkIndex)
{
NS_ENSURE_TRUE(mTextChildren, NS_ERROR_FAILURE);
*aSelectedLinkIndex = -1;
PRUint32 count;
@@ -503,6 +525,8 @@ NS_IMETHODIMP nsAccessibleHyperText::GetSelectedLinkIndex(PRInt32 *aSelectedLink
nsresult nsAccessibleHyperText::GetBounds(nsIWeakReference *aWeakShell, PRInt32 *x, PRInt32 *y, PRInt32 *width, PRInt32 *height)
{
NS_ENSURE_TRUE(mTextChildren, NS_ERROR_FAILURE);
*x = *y = *width = *height = 0;
nsRect unionRectTwips;

View File

@@ -44,7 +44,7 @@
NS_IMPL_ISUPPORTS_INHERITED0(nsHTMLLinkAccessible, nsLinkableAccessible)
nsHTMLLinkAccessible::nsHTMLLinkAccessible(nsIDOMNode* aDomNode, nsIWeakReference* aShell, nsIFrame *aFrame):
nsLinkableAccessible(aDomNode, aShell), mFrame(aFrame)
nsLinkableAccessible(aDomNode, aShell)
{
}
@@ -81,24 +81,3 @@ NS_IMETHODIMP nsHTMLLinkAccessible::GetState(PRUint32 *aState)
return NS_OK;
}
nsIFrame* nsHTMLLinkAccessible::GetFrame()
{
if (mWeakShell) {
if (!mFrame) {
mFrame = nsLinkableAccessible::GetFrame();
}
return mFrame;
}
return nsnull;
}
NS_IMETHODIMP nsHTMLLinkAccessible::FireToolkitEvent(PRUint32 aEvent,
nsIAccessible *aTarget,
void *aData)
{
if (aEvent == nsIAccessibleEvent::EVENT_HIDE) {
mFrame = nsnull; // Invalidate cached frame
}
return nsLinkableAccessible::FireToolkitEvent(aEvent, aTarget, aData);
}

View File

@@ -52,16 +52,6 @@ public:
NS_IMETHOD GetName(nsAString& _retval);
NS_IMETHOD GetRole(PRUint32 *_retval);
NS_IMETHOD GetState(PRUint32 *_retval);
// nsPIAccessNode
NS_IMETHOD_(nsIFrame *) GetFrame(void);
// nsPIAccessible
NS_IMETHOD FireToolkitEvent(PRUint32 aEvent, nsIAccessible *aTarget,
void *aData);
private:
nsIFrame *mFrame;
};
#endif

View File

@@ -804,13 +804,26 @@ NS_IMETHODIMP nsHTMLComboboxAccessible::GetRole(PRUint32 *_retval)
NS_IMETHODIMP nsHTMLComboboxAccessible::Shutdown()
{
nsHTMLSelectableAccessible::Shutdown();
// Need to hold these locally while we call Shutdown() on them.
nsCOMPtr<nsPIAccessNode> textFieldAcc(do_QueryInterface(mComboboxTextFieldAccessible));
nsCOMPtr<nsPIAccessNode> buttonAcc(do_QueryInterface(mComboboxButtonAccessible));
nsCOMPtr<nsPIAccessNode> listAcc(do_QueryInterface(mComboboxListAccessible));
if (listAcc) {
listAcc->Shutdown();
NS_ASSERTION(mComboboxTextFieldAccessible == nsnull, "why didn't InvalidateChildren clear this?");
}
if (buttonAcc) {
buttonAcc->Shutdown();
}
if (textFieldAcc) {
textFieldAcc->Shutdown();
}
mComboboxTextFieldAccessible = nsnull;
mComboboxButtonAccessible = nsnull;
mComboboxListAccessible = nsnull;
return NS_OK;
return nsHTMLSelectableAccessible::Shutdown();
}
NS_IMETHODIMP nsHTMLComboboxAccessible::Init()
@@ -889,6 +902,7 @@ NS_IMETHODIMP nsHTMLComboboxAccessible::GetFirstChild(nsIAccessible **aFirstChil
*aFirstChild = mFirstChild;
}
else {
NS_ASSERTION(!mComboboxTextFieldAccessible, "I already have a text field accessible!");
nsHTMLComboboxTextFieldAccessible* accessible =
new nsHTMLComboboxTextFieldAccessible(this, mDOMNode, mWeakShell);
*aFirstChild = accessible;
@@ -901,6 +915,14 @@ NS_IMETHODIMP nsHTMLComboboxAccessible::GetFirstChild(nsIAccessible **aFirstChil
return NS_OK;
}
NS_IMETHODIMP nsHTMLComboboxAccessible::InvalidateChildren()
{
mComboboxTextFieldAccessible = nsnull;
mComboboxButtonAccessible = nsnull;
mComboboxListAccessible = nsnull;
return nsAccessible::InvalidateChildren();
}
NS_IMETHODIMP nsHTMLComboboxAccessible::GetDescription(nsAString& aDescription)
{
// Use description of currently focused option
@@ -980,6 +1002,7 @@ NS_IMETHODIMP nsHTMLComboboxTextFieldAccessible::GetNextSibling(nsIAccessible **
*aNextSibling = accessible;
if (!*aNextSibling)
return NS_ERROR_FAILURE;
mNextSibling = *aNextSibling;
accessible->Init();
}
NS_ADDREF(*aNextSibling);
@@ -1235,6 +1258,7 @@ NS_IMETHODIMP nsHTMLComboboxButtonAccessible::GetNextSibling(nsIAccessible **aNe
*aNextSibling = accessible;
if (!*aNextSibling)
return NS_ERROR_OUT_OF_MEMORY;
mNextSibling = *aNextSibling;
accessible->Init();
}
NS_ADDREF(*aNextSibling);

View File

@@ -205,6 +205,7 @@ public:
NS_IMETHOD GetDescription(nsAString& aDescription);
NS_IMETHOD Shutdown();
NS_IMETHOD Init();
NS_IMETHOD InvalidateChildren();
protected:
already_AddRefed<nsIAccessible> GetFocusedOptionAccessible();

View File

@@ -49,7 +49,7 @@
#include "nsISelectionController.h"
nsHTMLTextAccessible::nsHTMLTextAccessible(nsIDOMNode* aDomNode, nsIWeakReference* aShell, nsIFrame *aFrame):
nsTextAccessibleWrap(aDomNode, aShell), mFrame(aFrame)
nsTextAccessibleWrap(aDomNode, aShell)
{
}
@@ -76,27 +76,6 @@ NS_IMETHODIMP nsHTMLTextAccessible::GetName(nsAString& aName)
return rv;
}
nsIFrame* nsHTMLTextAccessible::GetFrame()
{
if (!mWeakShell) {
return nsnull;
}
if (!mFrame) {
mFrame = nsTextAccessible::GetFrame();
}
return mFrame;
}
NS_IMETHODIMP nsHTMLTextAccessible::FireToolkitEvent(PRUint32 aEvent,
nsIAccessible *aTarget,
void *aData)
{
if (aEvent == nsIAccessibleEvent::EVENT_HIDE) {
mFrame = nsnull; // Invalidate cached frame
}
return nsTextAccessibleWrap::FireToolkitEvent(aEvent, aTarget, aData);
}
NS_IMETHODIMP nsHTMLTextAccessible::GetState(PRUint32 *aState)
{
nsTextAccessible::GetState(aState);

View File

@@ -53,16 +53,6 @@ public:
// nsIAccessible
NS_IMETHOD GetName(nsAString& _retval);
NS_IMETHOD GetState(PRUint32 *aState);
// nsPIAccessNode
NS_IMETHOD_(nsIFrame *) GetFrame(void);
// nsPIAccessible
NS_IMETHOD FireToolkitEvent(PRUint32 aEvent, nsIAccessible *aTarget,
void *aData);
private:
nsIFrame *mFrame; // Only valid if node is not shut down (mWeakShell != null)
};
class nsHTMLHRAccessible : public nsLeafAccessible

View File

@@ -251,7 +251,9 @@ STDMETHODIMP nsAccessibleWrap::get_accChild(
nsCOMPtr<nsIAccessible> childAccessible;
GetChildAt(varChild.lVal - 1, getter_AddRefs(childAccessible));
*ppdispChild = NativeAccessible(childAccessible);
if (childAccessible) {
*ppdispChild = NativeAccessible(childAccessible);
}
return (*ppdispChild)? S_OK: E_FAIL;
}
@@ -1015,6 +1017,10 @@ NS_IMETHODIMP nsAccessibleWrap::GetNativeInterface(void **aOutAccessible)
IDispatch *nsAccessibleWrap::NativeAccessible(nsIAccessible *aXPAccessible)
{
if (!aXPAccessible) {
return NULL;
}
nsCOMPtr<nsIAccessibleWin32Object> accObject(do_QueryInterface(aXPAccessible));
if (accObject) {
void* hwnd;

View File

@@ -182,11 +182,7 @@ NS_IMETHODIMP nsXULSelectableAccessible::RefSelection(PRInt32 aIndex, nsIAccessi
xulSelect->GetSelectedItem(getter_AddRefs(tempDOMNode));
if (tempDOMNode) {
nsCOMPtr<nsIAccessible> tempAccess;
accService->GetAccessibleInWeakShell(tempDOMNode, mWeakShell, getter_AddRefs(tempAccess));
*_retval = tempAccess;
NS_ADDREF(*_retval);
return NS_OK;
return accService->GetAccessibleInWeakShell(tempDOMNode, mWeakShell, _retval);
}
return NS_ERROR_FAILURE;

View File

@@ -1,7 +1,7 @@
WIN32_MODULE_COMPANYNAME=Mozilla Corporation
WIN32_MODULE_COPYRIGHT=©Firefox and Mozilla Developers, according to the MPL 1.1/GPL 2.0/LGPL 2.1 licenses, as applicable.
WIN32_MODULE_PRODUCTVERSION=2,0,0,4
WIN32_MODULE_PRODUCTVERSION_STRING=2.0.0.4pre
WIN32_MODULE_PRODUCTVERSION=2,0,0,5
WIN32_MODULE_PRODUCTVERSION_STRING=2.0.0.5pre
WIN32_MODULE_TRADEMARKS=Firefox is a Trademark of The Mozilla Foundation.
WIN32_MODULE_DESCRIPTION=Firefox
WIN32_MODULE_PRODUCTNAME=Firefox

View File

@@ -1662,7 +1662,7 @@ var BookmarksUtils = {
if (aSelection.length > 1)
gBkmkTxnSvc.endBatch();
if (aSelection.length > kBATCH_LIMIT && aAction != "move")
BMDS.beginUpdateBatch();
BMDS.endUpdateBatch();
return true;
},

View File

@@ -285,7 +285,7 @@ FeedWriter.prototype = {
var entryContainer = this._document.createElementNS(HTML_NS, "div");
entryContainer.className = "entry";
// If the entry has a title, make it a like
// If the entry has a title, make it a link
if (entry.title) {
var a = this._document.createElementNS(HTML_NS, "a");
a.appendChild(this._document.createTextNode(entry.title.plainText()));

View File

@@ -61,6 +61,7 @@ const nsIWindowWatcher = Components.interfaces.nsIWindowWatcher;
const nsICategoryManager = Components.interfaces.nsICategoryManager;
const nsIWebNavigationInfo = Components.interfaces.nsIWebNavigationInfo;
const nsIBrowserSearchService = Components.interfaces.nsIBrowserSearchService;
const nsICommandLineValidator = Components.interfaces.nsICommandLineValidator;
const NS_BINDING_ABORTED = 0x804b0002;
const NS_ERROR_WONT_HANDLE_CONTENT = 0x805d0001;
@@ -301,6 +302,7 @@ var nsBrowserContentHandler = {
!iid.equals(nsICommandLineHandler) &&
!iid.equals(nsIBrowserHandler) &&
!iid.equals(nsIContentHandler) &&
!iid.equals(nsICommandLineValidator) &&
!iid.equals(nsIFactory))
throw Components.errors.NS_ERROR_NO_INTERFACE;
@@ -604,6 +606,21 @@ var nsBrowserContentHandler = {
request.cancel(NS_BINDING_ABORTED);
},
/* nsICommandLineValidator */
validate : function bch_validate(cmdLine) {
// Other handlers may use osint so only handle the osint flag if the url
// flag is also present and the command line is valid.
var osintFlagIdx = cmdLine.findFlag("osint", false);
var urlFlagIdx = cmdLine.findFlag("url", false);
if (urlFlagIdx > -1 && (osintFlagIdx > -1 ||
cmdLine.state == nsICommandLine.STATE_REMOTE_EXPLICIT)) {
var urlParam = cmdLine.getArgument(urlFlagIdx + 1);
if (cmdLine.length != urlFlagIdx + 2 || /firefoxurl:/.test(urlParam))
throw NS_ERROR_ABORT;
cmdLine.handleFlag("osint", false)
}
},
/* nsIFactory */
createInstance: function bch_CI(outer, iid) {
if (outer != null)
@@ -866,6 +883,9 @@ var Module = {
catMan.addCategoryEntry("command-line-handler",
"x-default",
dch_contractID, true, true);
catMan.addCategoryEntry("command-line-validator",
"b-browser",
bch_contractID, true, true);
},
unregisterSelf : function mod_unregself(compMgr, location, type) {
@@ -880,6 +900,8 @@ var Module = {
"m-browser", true);
catMan.deleteCategoryEntry("command-line-handler",
"x-default", true);
catMan.deleteCategoryEntry("command-line-validator",
"b-browser", true);
},
canUnload: function(compMgr) {

View File

@@ -172,6 +172,10 @@ PROT_PhishMsgDisplayerBase.prototype.getMeOutOfHereUrl_ = function() {
try {
url = prefs.getComplexValue("browser.startup.homepage",
Ci.nsIPrefLocalizedString).data;
// If url is a pipe-delimited set of pages, just take the first one.
// This will need to change once bug 221445 is fixed.
if (url.indexOf("|") != -1)
url = url.split("|")[0];
} catch(e) {
G_Debug(this, "Couldn't get homepage pref: " + e);
}

View File

@@ -315,6 +315,7 @@ SessionStoreService.prototype = {
delete aBrowser.parentNode.__SS_data;
});
});
this._lastWindowClosed = null;
this._clearDisk();
// also clear all data about closed tabs
for (ix in this._windows) {

View File

@@ -151,7 +151,7 @@ OpenKeyForWriting(HKEY aStartKey, const char* aKeyName, HKEY* aKey,
//
// HKCU\SOFTWARE\Classes\FirefoxHTML\
// DefaultIcon (default) REG_SZ <apppath>,1
// shell\open\command (default) REG_SZ <apppath> -url "%1" -requestPending
// shell\open\command (default) REG_SZ <apppath> -requestPending -osint -url "%1"
// shell\open\ddeexec (default) REG_SZ "%1",,0,0,,,,
// shell\open\ddeexec NoActivateHandler REG_SZ
// \Application (default) REG_SZ Firefox
@@ -163,7 +163,7 @@ OpenKeyForWriting(HKEY aStartKey, const char* aKeyName, HKEY* aKey,
// EditFlags REG_DWORD 2
// FriendlyTypeName REG_SZ <appname> URL
// DefaultIcon (default) REG_SZ <apppath>,1
// shell\open\command (default) REG_SZ <apppath> -url "%1" -requestPending
// shell\open\command (default) REG_SZ <apppath> -requestPending -osint -url "%1"
// shell\open\ddeexec (default) REG_SZ "%1",,0,0,,,,
// shell\open\ddeexec NoActivateHandler REG_SZ
// \Application (default) REG_SZ Firefox
@@ -177,7 +177,7 @@ OpenKeyForWriting(HKEY aStartKey, const char* aKeyName, HKEY* aKey,
//
// HKCU\SOFTWARE\Classes\<protocol>\
// DefaultIcon (default) REG_SZ <apppath>,1
// shell\open\command (default) REG_SZ <apppath> -url "%1" -requestPending
// shell\open\command (default) REG_SZ <apppath> -requestPending -osint -url "%1"
// shell\open\ddeexec (default) REG_SZ "%1",,0,0,,,,
// shell\open\ddeexec NoActivateHandler REG_SZ
// \Application (default) REG_SZ Firefox
@@ -232,7 +232,7 @@ typedef struct {
#define CLS_HTML "FirefoxHTML"
#define CLS_URL "FirefoxURL"
#define VAL_FILE_ICON "%APPPATH%,1"
#define VAL_OPEN "%APPPATH% -url \"%1\" -requestPending"
#define VAL_OPEN "%APPPATH% -requestPending -osint -url \"%1\""
#define MAKE_KEY_NAME1(PREFIX, MID) \
PREFIX MID

View File

@@ -1 +1 @@
2.0.0.4pre
2.0.0.5pre

View File

@@ -7,6 +7,7 @@ chrome/app-chrome.manifest
chrome/overlayinfo/
chrome/m3ffxtbr.manifest
chrome/m3ffxtbr.jar
defaults/existing-profile-defaults.js
defaults/pref/all.js
defaults/pref/security-prefs.js
defaults/pref/winpref.js

View File

@@ -80,6 +80,7 @@ Var fhUninstallLog
!insertmacro WordReplace
!insertmacro GetSize
!insertmacro GetParameters
!insertmacro GetParent
!insertmacro GetOptions
!insertmacro GetRoot
!insertmacro DriveSpace
@@ -107,7 +108,7 @@ VIAddVersionKey "FileDescription" "${BrandShortName} Installer"
!insertmacro CanWriteToInstallDir
!insertmacro CheckDiskSpace
!insertmacro AddHandlerValues
!insertmacro DisplayCopyErrMsg
!insertmacro GetSingleInstallPath
!include shared.nsh
@@ -189,37 +190,57 @@ Section "-Application" Section1
SetDetailsPrint textonly
DetailPrint $(STATUS_CLEANUP)
SetDetailsPrint none
SetOutPath $INSTDIR
; Try to delete the app's main executable and if we can't delete it try to
; close the app. This allows running an instance that is located in another
; directory and prevents the launching of the app during the installation.
ClearErrors
; A copy of the executable is placed in a temporary directory so it can be
; copied back in the case where a specific file is checked / found to be in
; use that would prevent a successful install.
; Create a temporary backup directory.
GetTempFileName $TmpVal "$TEMP"
${DeleteFile} $TmpVal
SetOutPath $TmpVal
${If} ${FileExists} "$INSTDIR\${FileMainEXE}"
${DeleteFile} "$INSTDIR\${FileMainEXE}"
${EndIf}
${If} ${Errors}
ClearErrors
${CloseApp} "true" $(WARN_APP_RUNNING_INSTALL)
; Try to delete it again to prevent launching the app while we are
; installing.
ClearErrors
${DeleteFile} "$INSTDIR\${FileMainEXE}"
CopyFiles /SILENT "$INSTDIR\${FileMainEXE}" "$TmpVal\${FileMainEXE}"
Delete "$INSTDIR\${FileMainEXE}"
${If} ${Errors}
ClearErrors
; Try closing the app a second time
${CloseApp} "true" $(WARN_APP_RUNNING_INSTALL)
retry:
; Try to delete it again to prevent launching the app while we are
; installing.
ClearErrors
${DeleteFile} "$INSTDIR\${FileMainEXE}"
CopyFiles /SILENT "$INSTDIR\${FileMainEXE}" "$TmpVal\${FileMainEXE}"
Delete "$INSTDIR\${FileMainEXE}"
${If} ${Errors}
; Fallback to the FileError_NoIgnore error with retry/cancel options
${DisplayCopyErrMsg} "${FileMainEXE}"
GoTo retry
ClearErrors
; Try closing the app a second time
${CloseApp} "true" $(WARN_APP_RUNNING_INSTALL)
StrCpy $R1 "${FileMainEXE}"
Call CheckInUse
${EndIf}
${EndIf}
${EndIf}
StrCpy $R1 "freebl3.dll"
Call CheckInUse
StrCpy $R1 "nssckbi.dll"
Call CheckInUse
StrCpy $R1 "nspr4.dll"
Call CheckInUse
StrCpy $R1 "xpicleanup.exe"
Call CheckInUse
SetOutPath $INSTDIR
RmDir /r "$TmpVal"
ClearErrors
; During an install Vista checks if a new entry is added under the uninstall
; registry key (e.g. ARP). When the same version of the app is installed on
; top of an existing install the key is deleted / added and the Program
@@ -365,11 +386,8 @@ Section "-Application" Section1
${EndIf}
${LogHeader} "Adding Additional Files"
; Only for Firefox and only if they don't already exist
; Check if QuickTime is installed and copy the contents of its plugins
; directory into the app's plugins directory. Previously only the
; nsIQTScriptablePlugin.xpt files was copied which is not enough to enable
; QuickTime as a plugin.
; Check if QuickTime is installed and copy the nsIQTScriptablePlugin.xpt from
; its plugins directory into the app's components directory.
ClearErrors
ReadRegStr $R0 HKLM "Software\Apple Computer, Inc.\QuickTime" "InstallDir"
${Unless} ${Errors}
@@ -377,12 +395,16 @@ Section "-Application" Section1
${GetPathFromRegStr}
Pop $R0
${Unless} ${Errors}
GetFullPathName $R0 "$R0\Plugins"
GetFullPathName $R0 "$R0\Plugins\nsIQTScriptablePlugin.xpt"
${Unless} ${Errors}
${LogHeader} "Copying QuickTime Plugin Files"
${LogMsg} "Source Directory: $R0\Plugins"
StrCpy $R1 "$INSTDIR\plugins"
Call DoCopyFiles
${LogHeader} "Copying QuickTime Scriptable Component"
CopyFiles /SILENT "$R0" "$INSTDIR\components"
${If} ${Errors}
${LogMsg} "** ERROR Installing File: $INSTDIR\components\nsIQTScriptablePlugin.xpt **"
${Else}
${LogMsg} "Installed File: $INSTDIR\components\nsIQTScriptablePlugin.xpt"
${LogUninstall} "File: \components\nsIQTScriptablePlugin.xpt"
${EndIf}
${EndUnless}
${EndUnless}
${EndUnless}
@@ -539,7 +561,7 @@ Function installTalkback
; This will add it during install to the uninstall.log and retains the
; original disabled state from the installation.
${If} ${FileExists} "$R1\InstallDisabled"
CopyFiles "$R1\InstallDisabled" "$R0"
CopyFiles /SILENT "$R1\InstallDisabled" "$R0"
${EndIf}
; Remove the existing install of talkback
RmDir /r "$R1"
@@ -564,6 +586,31 @@ Function installTalkback
${EndIf}
FunctionEnd
; Copies a file to a temporary backup directory and then checks if it is in use
; by attempting to delete the file. If the file is in use an error is displayed
; and the user is given the options to either retry or cancel. If cancel is
; selected then the files are restored.
Function CheckInUse
${If} ${FileExists} "$INSTDIR\$R1"
retry:
ClearErrors
CopyFiles /SILENT "$INSTDIR\$R1" "$TmpVal\$R1"
${Unless} ${Errors}
Delete "$INSTDIR\$R1"
${EndUnless}
${If} ${Errors}
StrCpy $0 "$INSTDIR\$R1"
${WordReplace} "$(^FileError_NoIgnore)" "\r\n" "$\r$\n" "+*" $0
MessageBox MB_RETRYCANCEL|MB_ICONQUESTION "$0" IDRETRY retry
Delete "$TmpVal\$R1"
CopyFiles /SILENT "$TmpVal\*" "$INSTDIR\"
SetOutPath $INSTDIR
RmDir /r "$TmpVal"
Quit
${EndIf}
${EndIf}
FunctionEnd
; Adds a section divider to the human readable log.
Function WriteLogSeparator
FileWrite $fhInstallLog "$\r$\n-------------------------------------------------------------------------------$\r$\n"
@@ -645,8 +692,10 @@ Function CopyFile
CreateDirectory "$R1$R3\$R7"
${If} ${Errors}
${LogMsg} "** ERROR Creating Directory: $R1$R3\$R7 **"
${DisplayCopyErrMsg} "$R7"
GoTo retry
StrCpy $0 "$R1$R3\$R7"
${WordReplace} "$(^FileError_NoIgnore)" "\r\n" "$\r$\n" "+*" $0
MessageBox MB_RETRYCANCEL|MB_ICONQUESTION "$0" IDRETRY retry
Quit
${Else}
${LogMsg} "Created Directory: $R1$R3\$R7"
${EndIf}
@@ -657,25 +706,33 @@ Function CopyFile
CreateDirectory "$R1$R3"
${If} ${Errors}
${LogMsg} "** ERROR Creating Directory: $R1$R3 **"
${DisplayCopyErrMsg} "$R3"
GoTo retry
StrCpy $0 "$R1$R3"
${WordReplace} "$(^FileError_NoIgnore)" "\r\n" "$\r$\n" "+*" $0
MessageBox MB_RETRYCANCEL|MB_ICONQUESTION "$0" IDRETRY retry
Quit
${Else}
${LogMsg} "Created Directory: $R1$R3"
${EndIf}
${EndUnless}
${If} ${FileExists} "$R1$R3\$R7"
ClearErrors
Delete "$R1$R3\$R7"
${If} ${Errors}
${DisplayCopyErrMsg} "$R7"
GoTo retry
${LogMsg} "** ERROR Deleting File: $R1$R3\$R7 **"
StrCpy $0 "$R1$R3\$R7"
${WordReplace} "$(^FileError_NoIgnore)" "\r\n" "$\r$\n" "+*" $0
MessageBox MB_RETRYCANCEL|MB_ICONQUESTION "$0" IDRETRY retry
Quit
${EndIf}
${EndIf}
ClearErrors
CopyFiles /SILENT $R9 "$R1$R3"
${If} ${Errors}
${LogMsg} "** ERROR Installing File: $R1$R3\$R7 **"
${DisplayCopyErrMsg} "$R7"
GoTo retry
StrCpy $0 "$R1$R3\$R7"
${WordReplace} "$(^FileError_NoIgnore)" "\r\n" "$\r$\n" "+*" $0
MessageBox MB_RETRYCANCEL|MB_ICONQUESTION "$0" IDRETRY retry
Quit
${Else}
${LogMsg} "Installed File: $R1$R3\$R7"
${EndIf}
@@ -844,6 +901,17 @@ Function leaveComponents
FunctionEnd
Function preDirectory
SetShellVarContext all ; Set SHCTX to HKLM
${GetSingleInstallPath} "Software\Mozilla\${BrandFullNameInternal}" $R9
${If} $R9 == "false"
SetShellVarContext current ; Set SHCTX to HKCU
${GetSingleInstallPath} "Software\Mozilla\${BrandFullNameInternal}" $R9
${EndIf}
${Unless} $R9 == "false"
StrCpy $INSTDIR "$R9"
${EndUnless}
${If} $InstallType != 4
${CheckDiskSpace} $R9
${If} $R9 != "false"

View File

@@ -137,7 +137,7 @@
${StrFilter} "$8" "+" "" "" $8
StrCpy $0 "SOFTWARE\Classes"
StrCpy $2 "$8 -url $\"%1$\" -requestPending"
StrCpy $2 "$8 -requestPending -osint -url $\"%1$\""
; Associate the file handlers with FirefoxHTML
WriteRegStr SHCTX "$0\.htm" "" "FirefoxHTML"
@@ -171,8 +171,7 @@
${StrFilter} "${FileMainEXE}" "+" "" "" $R9
StrCpy $0 "Software\Clients\StartMenuInternet\$R9"
; Remove existing keys so we only have our settings
DeleteRegKey HKLM "$0"
WriteRegStr HKLM "$0" "" "${BrandFullName}"
WriteRegStr HKLM "$0\DefaultIcon" "" "$8,0"
@@ -351,7 +350,7 @@
; Store the command to open the app with an url in a register for easy access.
GetFullPathName /SHORT $8 "$INSTDIR\${FileMainEXE}"
${StrFilter} "$8" "+" "" "" $8
StrCpy $1 "$8 -url $\"%1$\" -requestPending"
StrCpy $1 "$8 -requestPending -osint -url $\"%1$\""
; Always set the file and protocol handlers since they may specify a
; different path and the path is used by Vista when setting associations.

View File

@@ -104,7 +104,6 @@ bin\components\fastfind.xpt
bin\components\feeds.xpt
bin\components\find.xpt
bin\components\gfx.xpt
bin\components\helperAppDlg.xpt
bin\components\history.xpt
bin\components\htmlparser.xpt
bin\components\imglib2.xpt
@@ -116,7 +115,6 @@ bin\components\jsconsole.xpt
bin\components\jsconsole-clhandler.js
bin\components\jsd3250.dll
bin\components\jsdservice.xpt
bin\components\jsurl.xpt
bin\components\layout_base.xpt
bin\components\layout_printing.xpt
bin\components\layout_xul.xpt
@@ -139,7 +137,6 @@ bin\components\necko_dns.xpt
bin\components\necko_file.xpt
bin\components\necko_ftp.xpt
bin\components\necko_http.xpt
bin\components\necko_jar.xpt
bin\components\necko_res.xpt
bin\components\necko_socket.xpt
bin\components\necko_viewsource.xpt
@@ -149,12 +146,10 @@ bin\components\places.xpt
bin\components\plugin.xpt
bin\components\pref.xpt
bin\components\prefetch.xpt
bin\components\prefmigr.xpt
bin\components\profile.xpt
bin\components\progressDlg.xpt
bin\components\proxyObject.xpt
bin\components\rdf.xpt
bin\components\related.xpt
bin\components\satchel.xpt
bin\components\saxparser.xpt
bin\components\search.xpt
@@ -168,7 +163,6 @@ bin\components\ucnative.xpt
bin\components\uconv.xpt
bin\components\unicharutil.xpt
bin\components\uriloader.xpt
bin\components\util.xpt
bin\components\wallet.xpt
bin\components\walleteditor.xpt
bin\components\walletpreview.xpt
@@ -264,7 +258,6 @@ bin\res\ua.css
bin\res\html.css
bin\res\quirk.css
bin\res\forms.css
bin\res\platform-forms.css
bin\res\EditorOverride.css
bin\res\table-add-column-after-active.gif
bin\res\table-add-column-after-hover.gif
@@ -304,7 +297,6 @@ bin\res\entityTables\*
; svg
bin\gksvggdiplus.dll
bin\res\svg.css
bin\res\svg.properties
bin\components\dom_svg.xpt
; spellchecker (may not be present)
@@ -325,7 +317,6 @@ bin\softokn3.dll
bin\freebl3.chk
bin\freebl3.dll
bin\ssl3.dll
bin\chrome\pipnss.jar
bin\chrome\pippki.jar
bin\chrome\pippki.manifest

View File

@@ -21,7 +21,7 @@ hu
it
ja-JP-mac osx
ja win32 linux
ka
ka win32 linux
ko
ku
lt

View File

@@ -21,6 +21,7 @@
- the Initial Developer. All Rights Reserved.
-
- Contributor(s):
- Markus Adrario <MarkusAdrario@web.de>
-
- Alternatively, the contents of this file may be used under the terms of
- either the GNU General Public License Version 2 or later (the "GPL"), or
@@ -137,6 +138,7 @@
<implementation implements="calIDecoratedView">
<field name="mTasksInView">false</field>
<field name="mShowCompleted">false</field>
<field name="mWorkdaysOnly">false</field>
<property name="workdaysOnly">
@@ -174,7 +176,7 @@
<method name="getSelectedItems">
<parameter name="aCount"/>
<body><![CDATA[
var selectedItems = document.getAnonymousElementByAttribute(this, "anonid", "view-element").getSelectedItems({});
var selectedItems = this.viewElem.getSelectedItems({});
aCount.value = selectedItems.length;
return selectedItems;
]]></body>
@@ -184,14 +186,13 @@
<parameter name="aItems"/>
<parameter name="aSuppressEvent"/>
<body><![CDATA[
var viewElement = document.getAnonymousElementByAttribute(this, "anonid", "view-element");
viewElement.setSelectedItems(aCount, aItems, aSuppressEvent);
this.viewElem.setSelectedItems(aCount, aItems, aSuppressEvent);
]]></body>
</method>
<property name="selectedDay">
<getter><![CDATA[
return document.getAnonymousElementByAttribute(this, "anonid", "view-element").selectedDay;
return this.viewElem.selectedDay;
]]></getter>
</property>
@@ -205,51 +206,61 @@
]]></setter>
</property>
<property name="controller">
<property name="showCompleted">
<getter><![CDATA[
return this.mShowCompleted;
]]></getter>
<setter><![CDATA[
this.mShowCompleted = val;
return val;
]]></setter>
</property>
<property name="controller">
<getter><![CDATA[
return document.getAnonymousElementByAttribute(this, "anonid", "view-element").controller;
return this.viewElem.controller;
]]></getter>
<setter><![CDATA[
document.getAnonymousElementByAttribute(this, "anonid", "view-element").controller = val;
this.viewElem.controller = val;
return val;
]]></setter>
</property>
<property name="displayCalendar">
<getter><![CDATA[
return document.getAnonymousElementByAttribute(this, "anonid", "view-element").displayCalendar;
return this.viewElem.displayCalendar;
]]></getter>
<setter><![CDATA[
document.getAnonymousElementByAttribute(this, "anonid", "view-element").displayCalendar = val;
this.viewElem.displayCalendar = val;
return val;
]]></setter>
</property>
<property name="timezone">
<getter><![CDATA[
return document.getAnonymousElementByAttribute(this, "anonid", "view-element").timezone;
return this.viewElem.timezone;
]]></getter>
<setter><![CDATA[
document.getAnonymousElementByAttribute(this, "anonid", "view-element").timezone = val;
this.viewElem.timezone = val;
return val;
]]></setter>
</property>
<property name="selectionObserver">
<getter><![CDATA[
return document.getAnonymousElementByAttribute(this, "anonid", "view-element").mSelectionObserver;
return this.viewElem.mSelectionObserver;
]]></getter>
</property>
<property name="startDay">
<getter><![CDATA[
return document.getAnonymousElementByAttribute(this, "anonid", "view-element").startDate;
return this.viewElem.startDate;
]]></getter>
</property>
<property name="endDay">
<getter><![CDATA[
return document.getAnonymousElementByAttribute(this, "anonid", "view-element").endDate;
return this.viewElem.endDate;
]]></getter>
</property>
@@ -263,8 +274,7 @@
<method name="goToDay">
<parameter name="aDate"/>
<body><![CDATA[
var viewElement = document.getAnonymousElementByAttribute(this, "anonid", "view-element");
viewElement.showDate(aDate);
this.viewElem.showDate(aDate);
]]></body>
</method>
<method name="moveView">

View File

@@ -68,14 +68,15 @@
<method name="goToDay">
<parameter name="aDate"/>
<body><![CDATA[
var viewElement = document.getAnonymousElementByAttribute(this, "anonid", "view-element");
var viewElement = this.viewElem;
viewElement.tasksInView = this.mTasksInView;
viewElement.showCompleted = this.mShowCompleted;
aDate = aDate.getInTimezone(viewElement.timezone);
viewElement.setDateRange(aDate, aDate);
viewElement.selectedDay = aDate;
this.setNavLabels(aDate)
viewElement.setDateRange(aDate, aDate);
viewElement.selectedDay = aDate;
]]></body>
</method>
<method name="moveView">

View File

@@ -57,9 +57,7 @@
<implementation implements="calIDecoratedView">
<constructor><![CDATA[
// Set the preference for the default start of the week
var viewElem = document.getAnonymousElementByAttribute(
this, "anonid", "view-element");
viewElem.weekStartOffset = getPrefSafe("calendar.week.start", 0);
this.viewElem.weekStartOffset = getPrefSafe("calendar.week.start", 0);
this.updateDaysOffPrefs();
@@ -100,9 +98,7 @@
break;
case "calendar.week.start":
viewElem = document.getAnonymousElementByAttribute(
this.calView, "anonid", "view-element");
viewElem.weekStartOffset = subj.getIntPref(pref);
this.calView.viewElem.weekStartOffset = subj.getIntPref(pref);
if (!this.calView.startDay || !this.calView.endDay) {
// Don't refresh if we're not initialized
@@ -113,9 +109,7 @@
this.calView.goToDay(this.calView.selectedDay);
break;
case "calendar.timezone.local":
var viewElem = document.getAnonymousElementByAttribute(
this.calView, "anonid", "view-element");
viewElem.timezone = subj.getCharPref(pref);
this.calView.viewElem.timezone = subj.getCharPref(pref);
if (!this.calView.startDay || !this.calView.endDay) {
// Don't refresh if we're not initialized
return;
@@ -141,8 +135,9 @@
<method name="goToDay">
<parameter name="aDate"/>
<body><![CDATA[
var viewElement = document.getAnonymousElementByAttribute(this, "anonid", "view-element");
viewElement.tasksInView = this.mTasksInView;
var viewElement = this.viewElem;
viewElement.tasksInView = this.mTasksInView;
viewElement.showCompleted = this.mShowCompleted;
viewElement.displayDaysOff = !this.mWorkdaysOnly;
aDate = aDate.getInTimezone(viewElement.timezone);
@@ -156,7 +151,7 @@
<method name="moveView">
<parameter name="aNumber"/>
<body><![CDATA[
var monthViewElement = document.getAnonymousElementByAttribute(this, "anonid", "view-element");
var monthViewElement = this.viewElem;
var dates = monthViewElement.getDateList({});
monthViewElement.displayDaysOff = !this.mWorkdaysOnly;
@@ -221,10 +216,7 @@
daysOff.push(Number(i));
}
}
var viewElem = document.getAnonymousElementByAttribute(
this, "anonid", "view-element");
viewElem.daysOffArray = daysOff;
this.viewElem.daysOffArray = daysOff;
]]></body>
</method>
</implementation>

View File

@@ -58,9 +58,7 @@
<implementation implements="calIDecoratedView">
<constructor><![CDATA[
// Set the preference for the default start of the week
var viewElem = document.getAnonymousElementByAttribute(
this, "anonid", "view-element");
viewElem.weekStartOffset = getPrefSafe("calendar.week.start", 0);
this.viewElem.weekStartOffset = getPrefSafe("calendar.week.start", 0);
this.mWeeksInView = getPrefSafe("calendar.weeks.inview", 4);
@@ -103,9 +101,7 @@
break;
case "calendar.week.start":
var viewElem = document.getAnonymousElementByAttribute(
this.calView, "anonid", "view-element");
viewElem.weekStartOffset = subj.getIntPref(pref);
this.calView.viewElem.weekStartOffset = subj.getIntPref(pref);
if (!this.calView.startDay || !this.calView.endDay) {
// Don't refresh if we're not initialized
@@ -125,9 +121,7 @@
this.calView.goToDay(this.calView.selectedDay);
break;
case "calendar.timezone.local":
var viewElem = document.getAnonymousElementByAttribute(
this.calView, "anonid", "view-element");
viewElem.timezone = subj.getCharPref(pref);
this.calView.viewElem.timezone = subj.getCharPref(pref);
if (!this.calView.startDay || !this.calView.endDay) {
// Don't refresh if we're not initialized
return;
@@ -168,9 +162,10 @@
<method name="goToDay">
<parameter name="aDate"/>
<body><![CDATA[
var viewElement = document.getAnonymousElementByAttribute(this, "anonid", "view-element");
var viewElement = this.viewElem;
viewElement.showFullMonth = false;
viewElement.tasksInView = this.mTasksInView;
viewElement.showCompleted = this.mShowCompleted;
viewElement.displayDaysOff = !this.mWorkdaysOnly;
aDate = aDate.getInTimezone(viewElement.timezone);
@@ -213,10 +208,9 @@
d1.day += 7 * (aNumber + getPrefSafe("calendar.previousweeks.inview", 4));
d1.normalize();
this.goToDay(d1);
var viewElement = document.getAnonymousElementByAttribute(this, "anonid", "view-element");
savedSelectedDay.day += 7*aNumber;
savedSelectedDay.normalize();
viewElement.selectedDay = savedSelectedDay;
this.viewElem.selectedDay = savedSelectedDay;
]]></body>
</method>
<method name="setNavLabels">
@@ -272,9 +266,7 @@
daysOff.push(Number(i));
}
}
var viewElem = document.getAnonymousElementByAttribute(
this, "anonid", "view-element");
viewElem.daysOffArray = daysOff;
this.viewElem.daysOffArray = daysOff;
]]></body>
</method>
</implementation>

View File

@@ -103,8 +103,9 @@
<method name="goToDay">
<parameter name="aDate"/>
<body><![CDATA[
var viewElement = document.getAnonymousElementByAttribute(this, "anonid", "view-element");
viewElement.tasksInView = this.mTasksInView;
var viewElement = this.viewElem;
viewElement.tasksInView = this.mTasksInView;
viewElement.showCompleted = this.mShowCompleted;
viewElement.displayDaysOff = !this.mWorkdaysOnly;
aDate = aDate.getInTimezone(viewElement.timezone);
@@ -126,9 +127,9 @@
d1.normalize();
d2.normalize();
}
this.setNavLabels(aDate);
viewElement.setDateRange(d1, d2);
viewElement.selectedDay = aDate;
this.setNavLabels(aDate);
]]></body>
</method>
<method name="moveView">

View File

@@ -65,7 +65,6 @@
<script type="application/x-javascript" src="chrome://calendar/content/calendar-event-dialog.js"/>
<script type="application/x-javascript" src="chrome://calendar/content/calendar-dialog-utils.js"/>
<script type="application/x-javascript" src="chrome://calendar/content/calUtils.js"/>
<script type="application/x-javascript" src="chrome://calendar/content/applicationUtil.js"/>
<!-- Used for the button to show/hide details -->
<script type="application/x-javascript">
@@ -110,7 +109,7 @@
<textbox id="item-location"/>
</row>
<row align ="center">
<row align="center">
<hbox align="center">
<label value="&newevent.from.label;" class="event-only"
accesskey="&newevent.from.accesskey;"
@@ -342,7 +341,7 @@
</hbox>
</row>
<row class="todo-only" details="true">
<row align="center" class="todo-only" details="true">
<label id="todo-status-label" value="&newevent.status.label;"/>
<hbox align="center">
<menulist id="todo-status" class="todo-only"

View File

@@ -0,0 +1,188 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Minimonth Busy Highlighter code.
*
* The Initial Developer of the Original Code is
* Philipp Kewisch <mozilla@kewis.ch>
* Portions created by the Initial Developer are Copyright (C) 2007
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
/* NOTE: This script requires functions from calUtils.js, calendar-views.js
* and also the getCompositeCalendar() function which is target app
* dependant.
*/
var minimonthBusyListener = {
QueryInterface: function mBL_QueryInterface(aIID) {
if (!aIID.equals(Ci.calIOperationListener) &&
!aIID.equals(Ci.calICompositeObserver) &&
!aIID.equals(Ci.calIObserver) &&
!aIID.equals(Ci.nsISupports)) {
throw Cr.NS_ERROR_NO_INTERFACE;
}
return this;
},
// calIOperationListener methods
onOperationComplete: function mBL_onOperationComplete(aCalendar,
aStatus,
aOperationType,
aId,
aDetail) {},
onGetResult: function mBL_onGetResult(aCalendar,
aStatus,
aItemType,
aDetail,
aCount,
aItems) {
if (!Components.isSuccessCode(aStatus)) {
return;
}
for each (var item in aItems) {
this.setBusyDaysForEvent(item, true);
}
},
setBusyDaysForEvent: function mBL_setBusyDaysForOccurrence(aItem, aState) {
if (aItem.getProperty("TRANSP") == "TRANSPARENT") {
// Skip transparent events
return;
}
var minimonth = getMinimonth();
var start = aItem.startDate || aItem.entryDate || aItem.dueDate;
var end = aItem.endDate || aItem.dueDate || start;
if (!start) {
return;
}
// We need to compare with midnight of the current day, so reset the
// time here.
var current = start.clone();
current.hour = 0;
current.minute = 0;
current.second = 0;
// Cache the result so the compare isn't called in each iteration.
var compareResult = (start.compare(end) == 0 ? 1 : 0);
// Setup the busy days.
while (current.compare(end) < compareResult) {
var box = minimonth.getBoxForDate(current.jsDate);
if (box) {
var n = parseInt(box.getAttribute("busy") || 0) +
(aState ? 1 : -1);
if (n > 0) {
box.setAttribute("busy", n);
} else {
box.removeAttribute("busy");
}
}
current.day++;
current.normalize();
}
},
// calIObserver methods
onStartBatch: function mBL_onStartBatch() {},
onEndBatch: function mBL_onEndBatch() {},
onLoad: function mBL_onLoad(aCalendar) {},
onAddItem: function mBL_onAddItem(aItem) {
this.setBusyDaysForEvent(aItem, true);
},
onDeleteItem: function mBL_onDeleteItem(aItem) {
this.setBusyDaysForEvent(aItem, false);
},
onModifyItem: function mBL_onModifyItem(aNewItem, aOldItem) {
this.setBusyDaysForEvent(aOldItem, false);
this.setBusyDaysForEvent(aNewItem, true);
},
onError: function mBL_onError(aErrNo, aMessage) {},
// calICompositeObserver methods
onCalendarAdded: function mBL_onCalendarAdded(aCalendar) {
var minimonth = getMinimonth();
minimonth.resetAttributesForDate();
monthChangeListener({ target: minimonth });
},
onCalendarRemoved: function mBL_onCalendarRemoved(aCalendar) {
var minimonth = getMinimonth();
minimonth.resetAttributesForDate();
monthChangeListener({ target: minimonth });
},
onDefaultCalendarChanged: function mBL_onDefaultCalendarChanged(aNew) {}
};
function monthChangeListener(event) {
// The minimonth automatically clears extra styles on a month change.
// Therefore we only need to fill the minimonth with new info.
var start = event.target.firstDate;
var end = event.target.lastDate;
var composite = getCompositeCalendar();
var filter = composite.ITEM_FILTER_COMPLETED_ALL |
composite.ITEM_FILTER_CLASS_OCCURRENCES |
composite.ITEM_FILTER_ALL_ITEMS;
// Get new info
composite.getItems(filter,
0,
jsDateToDateTime(start),
jsDateToDateTime(end),
minimonthBusyListener);
}
function minimonthOnLoad() {
var minimonth = getMinimonth();
minimonth.addEventListener("monthchange", monthChangeListener, false);
monthChangeListener({ target: minimonth });
getCompositeCalendar().addObserver(minimonthBusyListener);
}
function minimonthOnUnload() {
var minimonth = getMinimonth();
minimonth.removeEventListener("monthchange", monthChangeListener, false);
monthChangeListener({ target: minimonth });
getCompositeCalendar().removeObserver(minimonthBusyListener);
}
window.addEventListener("load", minimonthOnLoad, false);
window.addEventListener("unload", minimonthOnUnload, false);

View File

@@ -26,6 +26,7 @@
- Clint Talbert <cmtalbert@myfastmail.com>
- Michael Büttner <michael.buettner@sun.com>
- Philipp Kewisch <mozilla@kewis.ch>
- Markus Adrario <MarkusAdrario@web.de>
-
- Alternatively, the contents of this file may be used under the terms of
- either the GNU General Public License Version 2 or later (the "GPL"), or
@@ -850,6 +851,7 @@
<field name="mShowDaysOutsideMonth">true</field>
<field name="mTasksInView">false</field>
<field name="mShowCompleted">false</field>
<field name="mShowFullMonth">true</field>
<field name="mWeekStartOffset">0</field>
<field name="mDaysOffArray">[0,6]</field>
@@ -965,6 +967,16 @@
]]></setter>
</property>
<property name="showCompleted">
<getter><![CDATA[
return this.mShowCompleted;
]]></getter>
<setter><![CDATA[
this.mShowCompleted = val;
return val;
]]></setter>
</property>
<property name="showFullMonth">
<getter><![CDATA[
return this.mShowFullMonth;
@@ -1185,8 +1197,12 @@
if (!this.mCalendar)
return;
var filter = this.mCalendar.ITEM_FILTER_COMPLETED_ALL |
this.mCalendar.ITEM_FILTER_CLASS_OCCURRENCES;
var filter = this.mCalendar.ITEM_FILTER_CLASS_OCCURRENCES;
if (this.showCompleted) {
filter |= this.mCalendar.ITEM_FILTER_COMPLETED_ALL;
} else {
filter |= this.mCalendar.ITEM_FILTER_COMPLETED_NO;
}
if (this.mTasksInView)
filter |= this.mCalendar.ITEM_FILTER_TYPE_ALL;
@@ -1546,8 +1562,13 @@
return;
}
if (isToDo(aItem) && !this.calView.mTasksInView) {
if (isToDo(aItem)) {
if (!this.calView.mTasksInView) {
return;
}
if (aItem.isCompleted && !this.calView.mShowCompleted) {
return;
}
}
var occs = aItem.getOccurrencesBetween(this.calView.startDate,
@@ -1573,8 +1594,13 @@
for each (var occ in occs)
this.calView.doDeleteItem(occ);
if (isToDo(aNewItem) && !this.calView.mTasksInView) {
if (isToDo(aNewItem)) {
if (!this.calView.mTasksInView) {
return;
}
if (aNewItem.isCompleted && !this.calView.mShowCompleted) {
return;
}
}
occs = aNewItem.getOccurrencesBetween(this.calView.startDate,
this.calView.queryEndDate,
@@ -1587,8 +1613,13 @@
return;
}
if (isToDo(aItem) && !this.calView.mTasksInView) {
if (isToDo(aItem)) {
if (!this.calView.mTasksInView) {
return;
}
if (aItem.isCompleted && !this.calView.mShowCompleted) {
return;
}
}
var occs = aItem.getOccurrencesBetween(this.calView.startDate,

View File

@@ -26,6 +26,7 @@
- Dan Mosedale <dan.mosedale@oracle.com>
- Michael Büttner <michael.buettner@sun.com>
- Philipp Kewisch <mozilla@kewis.ch>
- Markus Adrario <MarkusAdrario@web.de>
-
- Alternatively, the contents of this file may be used under the terms of
- either the GNU General Public License Version 2 or later (the "GPL"), or
@@ -149,14 +150,19 @@
theMin += dur;
if (dur == 0) dur = 60;
// calculate duration pixel as the difference between
// start pixel and end pixel to avoid rounding errors.
var startPix = Math.round(theMin * this.mPixPerMin);
var endPix = Math.round((theMin + dur) * this.mPixPerMin);
var durPix = endPix - startPix;
var box;
if (dur != 60) {
box = makeTimeBox("", dur * this.mPixPerMin);
box = makeTimeBox("", durPix);
} else {
timeString = formatter.FormatTime("",
Ci.nsIScriptableDateFormat.timeFormatNoSeconds,
theHour, 0, 0);
box = makeTimeBox(timeString, dur * this.mPixPerMin);
box = makeTimeBox(timeString, durPix);
}
box.setAttribute("class", "calendar-time-bar-box-" + (theHour % 2 == 0 ? "even" : "odd"));
@@ -255,7 +261,7 @@
<xul:stack anonid="boxstack" flex="1" style="min-width: 1px; min-height: 1px">
<xul:box anonid="bgbox" flex="1" style="min-width: 1px; min-height: 1px"/>
<xul:box xbl:inherits="context" anonid="topbox" flex="1" equalsize="always" style="min-width: 1px; min-height: 1px"/>
<xul:box anonid="fgbox" flex="1" class="fgdragcontainer" style="min-width: 1px; min-height: 1px">
<xul:box anonid="fgbox" flex="1" class="fgdragcontainer" style="min-width: 1px; min-height: 1px; overflow:hidden;">
<xul:box anonid="fgdragspacer" style="display: inherit; overflow: hidden;">
<xul:spacer flex="1"/>
<xul:label anonid="fgdragbox-startlabel" class="fgdragbox-label"/>
@@ -1107,8 +1113,13 @@
}
}
var dragDay = col.mDate;
if (dragState.dragType == "modify-start" ||
dragState.dragType == "new") {
newStart.day = dragDay.day;
newStart.month = dragDay.month;
newStart.year = dragDay.year;
newStart.hour = 0;
newStart.minute = dragState.startMin + col.mStartMin;
newStart.normalize();
@@ -1116,6 +1127,9 @@
if (dragState.dragType == "modify-end" ||
dragState.dragType == "new") {
newEnd.day = dragDay.day;
newEnd.month = dragDay.month;
newEnd.year = dragDay.year;
newEnd.hour = 0;
newEnd.minute = dragState.endMin + col.mStartMin;
newEnd.normalize();
@@ -1774,9 +1788,86 @@
</handlers>
</binding>
<binding id="calendar-day-label">
<content>
<xul:hbox anonid="mainbox" flex="1">
<xul:spacer flex="1"/>
<xul:vbox>
<xul:label anonid="dateName" class="calendar-day-label-date"/>
<xul:label anonid="longWeekdayName" class="calendar-day-label-name"/>
<xul:label anonid="shortWeekdayName" class="calendar-day-label-name" hidden="true"/>
</xul:vbox>
<xul:spacer flex="1"/>
</xul:hbox>
</content>
<implementation>
<field name="longWeekdayPixels">0</field>
<field name="mDate">null</field>
<property name="date">
<getter><![CDATA[
return this.mDate;
]]></getter>
<setter><![CDATA[
this.mDate = val;
var df = Cc["@mozilla.org/calendar/datetime-formatter;1"].
getService(Ci.calIDateTimeFormatter);
var shortName = document.getAnonymousElementByAttribute(this, "anonid", "shortWeekdayName");
var longName = document.getAnonymousElementByAttribute(this, "anonid", "longWeekdayName");
var day = document.getAnonymousElementByAttribute(this, "anonid", "dateName");
longName.setAttribute("value", calGetString("dateFormat","day." + (val.weekday + 1) + ".name"));
shortName.setAttribute("value", calGetString("dateFormat","day." + (val.weekday + 1) + ".Mmm"));
day.setAttribute("value", df.formatDateWithoutYear(val));
return val;
]]></setter>
</property>
<property name="shortWeekNames">
<getter><![CDATA[
return document.getAnonymousElementByAttribute(this, "anonid", "shortWeekdayName").hasAttribute("hidden");
]]></getter>
<setter><![CDATA[
var shortName = document.getAnonymousElementByAttribute(this, "anonid", "shortWeekdayName");
var longName = document.getAnonymousElementByAttribute(this, "anonid", "longWeekdayName");
// cache before change, in case we are switching to short
this.cacheLongWeekdayPixels(longName);
if (val) {
longName.setAttribute("hidden","true");
shortName.removeAttribute("hidden");
} else {
longName.removeAttribute("hidden");
shortName.setAttribute("hidden","true");
}
// cache after change, in case we are switching from short
this.cacheLongWeekdayPixels(longName);
return val;
]]></setter>
</property>
<method name="cacheLongWeekdayPixels">
<parameter name="longName"/>
<body><![CDATA[
// Only do this if the long weekdays are visible and we haven't already cached.
if (!this.longWeekdayPixels && !longName.hasAttribute("hidden")) {
this.longWeekdayPixels = longName.boxObject.width +
parseInt(document.defaultView.getComputedStyle(longName, null).getPropertyValue("margin-left")) +
parseInt(document.defaultView.getComputedStyle(longName, null).getPropertyValue("margin-right"));
}
]]></body>
</method>
</implementation>
</binding>
<binding id="calendar-multiday-view">
<content>
<xul:box anonid="mainbox" flex="1">
<xul:box anonid="mainbox" flex="1" onoverflow="adjustWeekdayLength();">
<!-- these boxes are tricky: width or height in CSS depend on orient -->
<xul:box anonid="labelbox">
<xul:box anonid="labeltimespacer">
@@ -1794,9 +1885,7 @@
flex="1" equalsize="always" />
<xul:box anonid="headerscrollbarspacer"/>
</xul:box>
<xul:scrollbox anonid="childbox" flex="1"
onoverflow="adjustScrollBarSpacers();"
onunderflow="adjustScrollBarSpacers();">
<xul:scrollbox anonid="childbox" flex="1">
<!-- the orient of the calendar-time-bar needs to be the opposite of the parent -->
<xul:calendar-time-bar xbl:inherits="orient" anonid="timebar"/>
<xul:box anonid="daybox" class="calendar-day-box" flex="1"
@@ -1832,6 +1921,13 @@
this.mCalendar.removeObserver(this.mObserver);
]]></destructor>
<property name="daysInView" readonly="true">
<getter><![CDATA[
var labeldaybox = document.getAnonymousElementByAttribute(this, "anonid", "labeldaybox");
return labeldaybox.childNodes && labeldaybox.childNodes.length;
]]></getter>
</property>
<method name="onResize">
<parameter name="aRealSelf"/>
<body><![CDATA[
@@ -1847,12 +1943,15 @@
size = childbox.boxObject.height;
}
var ppm = size / self.mVisibleMinutes;
ppm = Math.floor(ppm * 10) / 10;
ppm = Math.floor(ppm * 1000) / 1000;
if (ppm < self.mMinPixelsPerMinute) {
ppm = self.mMinPixelsPerMinute;
}
self.pixelsPerMinute = ppm;
setTimeout(function(){self.scrollToMinute(self.mFirstVisibleMinute)}, 1);
// Fit the weekday labels while scrolling.
self.adjustWeekdayLength();
]]></body>
</method>
@@ -1882,6 +1981,7 @@
<field name="mBatchCount">0</field>
<field name="mPixPerMin">0.6</field>
<field name="mMinPixelsPerMinute">0.1</field>
<field name="mLongWeekdayTotalPixels">0</field>
<field name="mSelectedItems">[]</field>
<field name="mSelectedDayCol">null</field>
<field name="mSelectedDay">null</field>
@@ -1892,6 +1992,7 @@
<field name="mDayEndMin">17*60</field>
<field name="mVisibleMinutes">9*60</field>
<field name="mTasksInView">false</field>
<field name="mShowCompleted">false</field>
<field name="mDisplayDaysOff">true</field>
<field name="mDaysOffArray">[0,6]</field>
<field name="mTimezone">"UTC"</field>
@@ -1928,12 +2029,16 @@
return;
}
if (isToDo(aItem) && (!aItem.entryDate || !aItem.dueDate)) {
return;
}
if (isToDo(aItem) && !this.calView.mTasksInView) {
return;
if (isToDo(aItem)) {
if (!aItem.entryDate || !aItem.dueDate) {
return;
}
if(!this.calView.mTasksInView){
return;
}
if (aItem.isCompleted && !this.calView.mShowCompleted) {
return;
}
}
var occs = aItem.getOccurrencesBetween(this.calView.startDate,
@@ -1966,9 +2071,13 @@
this.calView.doDeleteEvent(occ);
}
}
if (isToDo(aNewItem) &&
(!aNewItem.entryDate || !aNewItem.dueDate || !this.calView.mTasksInView)) {
return;
if (isToDo(aNewItem)) {
if (!aNewItem.entryDate || !aNewItem.dueDate || !this.calView.mTasksInView) {
return;
}
if (aNewItem.isCompleted && !this.calView.mShowCompleted) {
return;
}
}
occs = aNewItem.getOccurrencesBetween(this.calView.startDate,
@@ -1983,12 +2092,16 @@
return;
}
if (isToDo(aItem) && !this.calView.mTasksInView) {
return;
}
if (isToDo(aItem) && (!aItem.entryDate || !aItem.dueDate)) {
return;
if (isToDo(aItem)) {
if (!this.calView.mTasksInView) {
return;
}
if (!aItem.entryDate || !aItem.dueDate) {
return;
}
if (aItem.isCompleted && !this.calView.mShowCompleted) {
return;
}
}
var occs = aItem.getOccurrencesBetween(this.calView.startDate,
@@ -2123,6 +2236,16 @@
]]></setter>
</property>
<property name="showCompleted">
<getter><![CDATA[
return this.mShowCompleted;
]]></getter>
<setter><![CDATA[
this.mShowCompleted = val;
return val;
]]></setter>
</property>
<property name="timezone">
<getter><![CDATA[
return this.mTimezone;
@@ -2518,8 +2641,12 @@
// we get all the items, and just filter out the ones we don't
// care about in addItem
var filter = this.mCalendar.ITEM_FILTER_COMPLETED_ALL |
this.mCalendar.ITEM_FILTER_CLASS_OCCURRENCES;
var filter = this.mCalendar.ITEM_FILTER_CLASS_OCCURRENCES;
if (this.mShowCompleted) {
filter |= this.mCalendar.ITEM_FILTER_COMPLETED_ALL;
} else {
filter |= this.mCalendar.ITEM_FILTER_COMPLETED_NO;
}
if(this.mTasksInView)
filter |= this.mCalendar.ITEM_FILTER_TYPE_ALL;
@@ -2601,6 +2728,7 @@
// get today's date
var today = this.today();
var counter = 0;
var maxDayWidth = 0;
var dayboxkids = daybox.childNodes;
var headerboxkids = headerdaybox.childNodes;
var labelboxkids = labeldaybox.childNodes;
@@ -2655,26 +2783,17 @@
getService(Ci.calIDateTimeFormatter);
if (counter < labelboxkids.length) {
labelbox = labelboxkids[counter];
labelbox.firstChild.setAttribute("value", df.formatDateWithoutYear(d));
labelbox.childNodes[1].setAttribute("value", calGetString("dateFormat", "day."+ (d.weekday+1)+ ".Mmm"));
labelbox.date = d;
labelbox.shortWeekNames = false;
} else {
labelbox = createXULElement("vbox");
labelbox = createXULElement("calendar-day-label");
labelbox.setAttribute("flex", "1");
labelbox.setAttribute("class", "calendar-day-label-box");
var label = createXULElement("label");
label.setAttribute("value", df.formatDateWithoutYear(d));
label.setAttribute("class", "calendar-day-label-date");
labelbox.appendChild(label);
labeldaybox.appendChild(labelbox);
label = createXULElement("label");
label.setAttribute("value", calGetString("dateFormat", "day."+ (d.weekday+1)+ ".Mmm"));
label.setAttribute("class", "calendar-day-label-name");
labelbox.appendChild(label);
labeldaybox.appendChild(labelbox);
labelbox.date = d;
labelbox.shortWeekNames = false;
}
maxDayWidth = Math.max(maxDayWidth, labelbox.longWeekdayPixels);
// We don't want to actually mess with our original dates, plus
// they're likely to be immutable.
@@ -2695,6 +2814,9 @@
removeExtraKids(headerdaybox);
removeExtraKids(labeldaybox);
// Cache weekday length, give a 10 px grace period.
this.mLongWeekdayTotalPixels = maxDayWidth * labeldaybox.childNodes.length + 10;
// fix pixels-per-minute
this.onResize();
for each (col in this.mDateColumns) {
@@ -2863,6 +2985,36 @@
return date;
]]></body>
</method>
<method name="adjustWeekdayLength">
<body><![CDATA[
// This function is called from the resize handler and also from the
// overflow event of the mainbox. The latter guarantees that the
// labels are clipped in the instance that the overflow occurrs,
// avoiding horizontal scrollbars from showing up for a short period.
var labeldaybox = document.getAnonymousElementByAttribute(this, "anonid", "labeldaybox");
var labeldayboxkids = labeldaybox.childNodes;
if (!labeldayboxkids || !labeldayboxkids[0]) {
// This happens in rotated view. Don't do anything there.
return;
}
if (labeldayboxkids[0].boxObject.width * this.daysInView > this.mLongWeekdayTotalPixels) {
// We have an underflow. Since the boxes all have equal width, we
// can use the first boxes' width and multiply bu the number of
// days in the view.
for each (var kid in labeldayboxkids) {
kid.shortWeekNames = false;
}
} else {
// We have an overflow
for each (var kid in labeldayboxkids) {
kid.shortWeekNames = true;
}
}
]]></body>
</method>
<method name="adjustScrollBarSpacers">
<body><![CDATA[

View File

@@ -22,6 +22,7 @@
* Vladimir Vukicevic <vladimir@pobox.com>
* Joey Minta <jminta@gmail.com>
* Michiel van Leeuwen <mvl@exedo.nl>
* Philipp Kewisch <mozilla@kewis.ch>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
@@ -60,6 +61,10 @@ calendar-multiday-view {
-moz-user-focus: normal;
}
calendar-day-label {
-moz-binding: url(chrome://calendar/content/calendar-multiday-view.xml#calendar-day-label);
}
calendar-header-container {
-moz-binding: url(chrome://calendar/content/calendar-multiday-view.xml#calendar-header-container);
}

View File

@@ -108,7 +108,8 @@
<textbox id="defaultlength"
preference="calendar.event.defaultlength"
maxlength="3"
size="3"/>
size="3"
oninput="validateNaturalNums(event);"/>
<label value="&calendar.global.units.minutes;"/>
</hbox>
@@ -119,7 +120,8 @@
<textbox id="defaultsnoozelength"
preference="calendar.alarms.defaultsnoozelength"
maxlength="3"
size="3"/>
size="3"
oninput="validateNaturalNums(event);"/>
<label value="&calendar.global.units.minutes;"/>
</hbox>

View File

@@ -179,12 +179,34 @@
value="/mozilla.org/20070129_1/America/Antigua"/>
<menuitem label="&pref.timezone.America.Araguaina;"
value="/mozilla.org/20070129_1/America/Araguaina"/>
<menuitem label="&pref.timezone.America.Argentina.Buenos_Aires;"
value="/mozilla.org/20070129_1/America/Argentina/Buenos_Aires"/>
<menuitem label="&pref.timezone.America.Argentina.Catamarca;"
value="/mozilla.org/20070129_1/America/Argentina/Catamarca"/>
<menuitem label="&pref.timezone.America.Argentina.Cordoba;"
value="/mozilla.org/20070129_1/America/Argentina/Cordoba"/>
<menuitem label="&pref.timezone.America.Argentina.Jujuy;"
value="/mozilla.org/20070129_1/America/Argentina/Jujuy"/>
<menuitem label="&pref.timezone.America.Argentina.La_Rioja;"
value="/mozilla.org/20070129_1/America/Argentina/La_Rioja"/>
<menuitem label="&pref.timezone.America.Argentina.Mendoza;"
value="/mozilla.org/20070129_1/America/Argentina/Mendoza"/>
<menuitem label="&pref.timezone.America.Argentina.Rio_Gallegos;"
value="/mozilla.org/20070129_1/America/Argentina/Rio_Gallegos"/>
<menuitem label="&pref.timezone.America.Argentina.San_Juan;"
value="/mozilla.org/20070129_1/America/Argentina/San_Juan"/>
<menuitem label="&pref.timezone.America.Argentina.Tucuman;"
value="/mozilla.org/20070129_1/America/Argentina/Tucuman"/>
<menuitem label="&pref.timezone.America.Argentina.Ushuaia;"
value="/mozilla.org/20070129_1/America/Argentina/Ushuaia"/>
<menuitem label="&pref.timezone.America.Aruba;"
value="/mozilla.org/20070129_1/America/Aruba"/>
<menuitem label="&pref.timezone.America.Asuncion;"
value="/mozilla.org/20070129_1/America/Asuncion"/>
<menuitem label="&pref.timezone.America.Atikokan;"
value="/mozilla.org/20070129_1/America/Atikokan"/>
<menuitem label="&pref.timezone.America.Bahia;"
value="/mozilla.org/20070129_1/America/Bahia"/>
<menuitem label="&pref.timezone.America.Barbados;"
value="/mozilla.org/20070129_1/America/Barbados"/>
<menuitem label="&pref.timezone.America.Belem;"
@@ -199,16 +221,14 @@
value="/mozilla.org/20070129_1/America/Bogota"/>
<menuitem label="&pref.timezone.America.Boise;"
value="/mozilla.org/20070129_1/America/Boise"/>
<menuitem label="&pref.timezone.America.Buenos_Aires;"
value="/mozilla.org/20070129_1/America/Buenos_Aires"/>
<menuitem label="&pref.timezone.America.Cambridge_Bay;"
value="/mozilla.org/20070129_1/America/Cambridge_Bay"/>
<menuitem label="&pref.timezone.America.Campo_Grande;"
value="/mozilla.org/20070129_1/America/Campo_Grande"/>
<menuitem label="&pref.timezone.America.Cancun;"
value="/mozilla.org/20070129_1/America/Cancun"/>
<menuitem label="&pref.timezone.America.Caracas;"
value="/mozilla.org/20070129_1/America/Caracas"/>
<menuitem label="&pref.timezone.America.Catamarca;"
value="/mozilla.org/20070129_1/America/Catamarca"/>
<menuitem label="&pref.timezone.America.Cayenne;"
value="/mozilla.org/20070129_1/America/Cayenne"/>
<menuitem label="&pref.timezone.America.Cayman;"
@@ -217,14 +237,14 @@
value="/mozilla.org/20070129_1/America/Chicago"/>
<menuitem label="&pref.timezone.America.Chihuahua;"
value="/mozilla.org/20070129_1/America/Chihuahua"/>
<menuitem label="&pref.timezone.America.Cordoba;"
value="/mozilla.org/20070129_1/America/Cordoba"/>
<menuitem label="&pref.timezone.America.Costa_Rica;"
value="/mozilla.org/20070129_1/America/Costa_Rica"/>
<menuitem label="&pref.timezone.America.Cuiaba;"
value="/mozilla.org/20070129_1/America/Cuiaba"/>
<menuitem label="&pref.timezone.America.Curacao;"
value="/mozilla.org/20070129_1/America/Curacao"/>
<menuitem label="&pref.timezone.America.Danmarkshavn;"
value="/mozilla.org/20070129_1/America/Danmarkshavn"/>
<menuitem label="&pref.timezone.America.Dawson;"
value="/mozilla.org/20070129_1/America/Dawson"/>
<menuitem label="&pref.timezone.America.Dawson_Creek;"
@@ -285,8 +305,6 @@
value="/mozilla.org/20070129_1/America/Iqaluit"/>
<menuitem label="&pref.timezone.America.Jamaica;"
value="/mozilla.org/20070129_1/America/Jamaica"/>
<menuitem label="&pref.timezone.America.Jujuy;"
value="/mozilla.org/20070129_1/America/Jujuy"/>
<menuitem label="&pref.timezone.America.Juneau;"
value="/mozilla.org/20070129_1/America/Juneau"/>
<menuitem label="&pref.timezone.America.Kentucky.Louisville;"
@@ -309,8 +327,6 @@
value="/mozilla.org/20070129_1/America/Martinique"/>
<menuitem label="&pref.timezone.America.Mazatlan;"
value="/mozilla.org/20070129_1/America/Mazatlan"/>
<menuitem label="&pref.timezone.America.Mendoza;"
value="/mozilla.org/20070129_1/America/Mendoza"/>
<menuitem label="&pref.timezone.America.Menominee;"
value="/mozilla.org/20070129_1/America/Menominee"/>
<menuitem label="&pref.timezone.America.Merida;"
@@ -339,6 +355,8 @@
value="/mozilla.org/20070129_1/America/Nome"/>
<menuitem label="&pref.timezone.America.Noronha;"
value="/mozilla.org/20070129_1/America/Noronha"/>
<menuitem label="&pref.timezone.America.North_Dakota.Center;"
value="/mozilla.org/20070129_1/America/North_Dakota/Center"/>
<menuitem label="&pref.timezone.America.North_Dakota.New_Salem;"
value="/mozilla.org/20070129_1/America/North_Dakota/New_Salem"/>
<menuitem label="&pref.timezone.America.Panama;"
@@ -367,8 +385,6 @@
value="/mozilla.org/20070129_1/America/Regina"/>
<menuitem label="&pref.timezone.America.Rio_Branco;"
value="/mozilla.org/20070129_1/America/Rio_Branco"/>
<menuitem label="&pref.timezone.America.Rosario;"
value="/mozilla.org/20070129_1/America/Rosario"/>
<menuitem label="&pref.timezone.America.Santiago;"
value="/mozilla.org/20070129_1/America/Santiago"/>
<menuitem label="&pref.timezone.America.Santo_Domingo;"
@@ -399,6 +415,8 @@
value="/mozilla.org/20070129_1/America/Thunder_Bay"/>
<menuitem label="&pref.timezone.America.Tijuana;"
value="/mozilla.org/20070129_1/America/Tijuana"/>
<menuitem label="&pref.timezone.America.Toronto;"
value="/mozilla.org/20070129_1/America/Toronto"/>
<menuitem label="&pref.timezone.America.Tortola;"
value="/mozilla.org/20070129_1/America/Tortola"/>
<menuitem label="&pref.timezone.America.Vancouver;"
@@ -423,6 +441,8 @@
value="/mozilla.org/20070129_1/Antarctica/McMurdo"/>
<menuitem label="&pref.timezone.Antarctica.Palmer;"
value="/mozilla.org/20070129_1/Antarctica/Palmer"/>
<menuitem label="&pref.timezone.Antarctica.Rothera;"
value="/mozilla.org/20070129_1/Antarctica/Rothera"/>
<menuitem label="&pref.timezone.Antarctica.South_Pole;"
value="/mozilla.org/20070129_1/Antarctica/South_Pole"/>
<menuitem label="&pref.timezone.Antarctica.Syowa;"
@@ -461,8 +481,10 @@
value="/mozilla.org/20070129_1/Asia/Brunei"/>
<menuitem label="&pref.timezone.Asia.Calcutta;"
value="/mozilla.org/20070129_1/Asia/Calcutta"/>
<menuitem label="&pref.timezone.Asia.Chungking;"
value="/mozilla.org/20070129_1/Asia/Chungking"/>
<menuitem label="&pref.timezone.Asia.Choibalsan;"
value="/mozilla.org/20070129_1/Asia/Choibalsan"/>
<menuitem label="&pref.timezone.Asia.Chongqing;"
value="/mozilla.org/20070129_1/Asia/Chongqing"/>
<menuitem label="&pref.timezone.Asia.Colombo;"
value="/mozilla.org/20070129_1/Asia/Colombo"/>
<menuitem label="&pref.timezone.Asia.Damascus;"
@@ -511,10 +533,12 @@
value="/mozilla.org/20070129_1/Asia/Kuching"/>
<menuitem label="&pref.timezone.Asia.Kuwait;"
value="/mozilla.org/20070129_1/Asia/Kuwait"/>
<menuitem label="&pref.timezone.Asia.Macao;"
value="/mozilla.org/20070129_1/Asia/Macao"/>
<menuitem label="&pref.timezone.Asia.Macau;"
value="/mozilla.org/20070129_1/Asia/Macau"/>
<menuitem label="&pref.timezone.Asia.Magadan;"
value="/mozilla.org/20070129_1/Asia/Magadan"/>
<menuitem label="&pref.timezone.Asia.Makassar;"
value="/mozilla.org/20070129_1/Asia/Makassar"/>
<menuitem label="&pref.timezone.Asia.Manila;"
value="/mozilla.org/20070129_1/Asia/Manila"/>
<menuitem label="&pref.timezone.Asia.Muscat;"
@@ -525,6 +549,8 @@
value="/mozilla.org/20070129_1/Asia/Novosibirsk"/>
<menuitem label="&pref.timezone.Asia.Omsk;"
value="/mozilla.org/20070129_1/Asia/Omsk"/>
<menuitem label="&pref.timezone.Asia.Oral;"
value="/mozilla.org/20070129_1/Asia/Oral"/>
<menuitem label="&pref.timezone.Asia.Phnom_Penh;"
value="/mozilla.org/20070129_1/Asia/Phnom_Penh"/>
<menuitem label="&pref.timezone.Asia.Pontianak;"
@@ -533,12 +559,16 @@
value="/mozilla.org/20070129_1/Asia/Pyongyang"/>
<menuitem label="&pref.timezone.Asia.Qatar;"
value="/mozilla.org/20070129_1/Asia/Qatar"/>
<menuitem label="&pref.timezone.Asia.Qyzylorda;"
value="/mozilla.org/20070129_1/Asia/Qyzylorda"/>
<menuitem label="&pref.timezone.Asia.Rangoon;"
value="/mozilla.org/20070129_1/Asia/Rangoon"/>
<menuitem label="&pref.timezone.Asia.Riyadh;"
value="/mozilla.org/20070129_1/Asia/Riyadh"/>
<menuitem label="&pref.timezone.Asia.Saigon;"
value="/mozilla.org/20070129_1/Asia/Saigon"/>
<menuitem label="&pref.timezone.Asia.Sakhalin;"
value="/mozilla.org/20070129_1/Asia/Sakhalin"/>
<menuitem label="&pref.timezone.Asia.Samarkand;"
value="/mozilla.org/20070129_1/Asia/Samarkand"/>
<menuitem label="&pref.timezone.Asia.Seoul;"
@@ -559,8 +589,6 @@
value="/mozilla.org/20070129_1/Asia/Thimphu"/>
<menuitem label="&pref.timezone.Asia.Tokyo;"
value="/mozilla.org/20070129_1/Asia/Tokyo"/>
<menuitem label="&pref.timezone.Asia.Ujung_Pandang;"
value="/mozilla.org/20070129_1/Asia/Ujung_Pandang"/>
<menuitem label="&pref.timezone.Asia.Ulaanbaatar;"
value="/mozilla.org/20070129_1/Asia/Ulaanbaatar"/>
<menuitem label="&pref.timezone.Asia.Urumqi;"
@@ -673,6 +701,8 @@
value="/mozilla.org/20070129_1/Europe/Madrid"/>
<menuitem label="&pref.timezone.Europe.Malta;"
value="/mozilla.org/20070129_1/Europe/Malta"/>
<menuitem label="&pref.timezone.Europe.Mariehamn;"
value="/mozilla.org/20070129_1/Europe/Mariehamn"/>
<menuitem label="&pref.timezone.Europe.Minsk;"
value="/mozilla.org/20070129_1/Europe/Minsk"/>
<menuitem label="&pref.timezone.Europe.Monaco;"

View File

@@ -22,6 +22,7 @@ calendar.jar:
content/calendar/calendar-item-editing.js (content/calendar-item-editing.js)
content/calendar/calendar-month-view.xml (content/calendar-month-view.xml)
content/calendar/calendar-multiday-view.xml (content/calendar-multiday-view.xml)
content/calendar/calendar-minimonth-busy.js (content/calendar-minimonth-busy.js)
content/calendar/calendar-recurrence-dialog.js (content/calendar-recurrence-dialog.js)
content/calendar/calendar-recurrence-dialog.xul (content/calendar-recurrence-dialog.xul)
content/calendar/calendar-view-bindings.css (content/calendar-view-bindings.css)
@@ -51,6 +52,7 @@ calendar.jar:
#expand skin/classic/calendar/calendar-views.css (themes/__THEME__/calendar-views.css)
#expand skin/classic/calendar/toolbar-large.png (themes/__THEME__/toolbar-large.png)
#expand skin/classic/calendar/toolbar-small.png (themes/__THEME__/toolbar-small.png)
#expand skin/classic/calendar/mode-switch-icons.png (themes/__THEME__/mode-switch-icons.png)
skin/classic/calendar/event-grippy-bottom.png (themes/common/event-grippy-bottom.png)
skin/classic/calendar/event-grippy-left.png (themes/common/event-grippy-left.png)
skin/classic/calendar/event-grippy-right.png (themes/common/event-grippy-right.png)

View File

@@ -392,7 +392,7 @@ interface calIObserver : nsISupports
{
void onStartBatch();
void onEndBatch();
void onLoad();
void onLoad( in calICalendar aCalendar );
void onAddItem( in calIItemBase aItem );
void onModifyItem( in calIItemBase aNewItem, in calIItemBase aOldItem );
void onDeleteItem( in calIItemBase aDeletedItem );

View File

@@ -99,6 +99,11 @@ interface calIDecoratedView : nsISupports
*/
attribute boolean tasksInView;
/**
* Whether or not completed tasks are shown in the calICalendarView
*/
attribute boolean showCompleted;
/**
* See calICalendarView.idl for the description of these functions.
*/

View File

@@ -51,13 +51,22 @@ function newTimerWithCallback(callback, delay, repeating)
function calAlarmService() {
this.wrappedJSObject = this;
this.mLoadedCalendars = {};
this.calendarObserver = {
alarmService: this,
// calIObserver:
onStartBatch: function() { },
onEndBatch: function() { },
onLoad: function() { },
onLoad: function co_onLoad(calendar) {
// ignore any onLoad events until initial getItems() call of startup has finished:
if (calendar && this.alarmService.mLoadedCalendars[calendar.id]) {
// a refreshed calendar signals that it has been reloaded
// (and cannot notify detailed changes), thus reget all alarms of it:
this.alarmService.initAlarms([calendar]);
}
},
onAddItem: function(aItem) {
var occs = [];
if (aItem.recurrenceInfo) {
@@ -95,8 +104,13 @@ function calAlarmService() {
onCalendarRegistered: function(aCalendar) {
this.alarmService.observeCalendar(aCalendar);
// initial refresh of alarms for new calendar:
this.alarmService.initAlarms([aCalendar]);
},
onCalendarUnregistering: function(aCalendar) {
// XXX todo: we need to think about calendar unregistration;
// there may still be dangling items (-> alarm dialog),
// dismissing those alarms may write data...
this.alarmService.unobserveCalendar(aCalendar);
},
onCalendarDeleting: function(aCalendar) {},
@@ -254,7 +268,6 @@ calAlarmService.prototype = {
observerSvc.addObserver(this, "xpcom-shutdown", false);
/* Tell people that we're alive so they can start monitoring alarms.
* Make sure to do this before calling findAlarms().
*/
this.notifier = Components.classes["@mozilla.org/embedcomp/appstartup-notifier;1"].getService(Components.interfaces.nsIObserver);
var notifier = this.notifier;
@@ -269,15 +282,39 @@ calAlarmService.prototype = {
this.observeCalendar(calendar);
}
this.findAlarms();
/* set up a timer to update alarms every N hours */
var timerCallback = {
alarmService: this,
notify: function(timer) {
this.alarmService.findAlarms();
notify: function timer_notify() {
var now = jsDateToDateTime((new Date())).getInTimezone("UTC");
var start;
if (!this.alarmService.mRangeEnd) {
// This is our first search for alarms. We're going to look for
// alarms +/- 1 month from now. If someone sets an alarm more than
// a month ahead of an event, or doesn't start Sunbird/Lightning
// for a month, they'll miss some, but that's a slim chance
start = now.clone();
start.month -= 1;
start.normalize();
} else {
// This is a subsequent search, so we got all the past alarms before
start = this.alarmService.mRangeEnd.clone();
}
var until = now.clone();
until.month += 1;
until.normalize();
// We don't set timers for every future alarm, only those within 6 hours
var end = now.clone();
end.hour += kHoursBetweenUpdates;
end.normalize();
this.alarmService.mRangeEnd = end.getInTimezone("UTC");
this.alarmService.findAlarms(this.alarmService.calendarManager.getCalendars({}),
start, until);
}
};
timerCallback.notify();
this.mUpdateTimer = newTimerWithCallback(timerCallback, kHoursBetweenUpdates * 3600000, true);
@@ -430,14 +467,19 @@ dump("alarm is in the past, and unack'd, firing now!\n");
}
},
findAlarms: function() {
findAlarms: function cas_findAlarms(calendars, start, until) {
var getListener = {
alarmService: this,
onOperationComplete: function(aCalendar, aStatus, aOperationType, aId, aDetail) {
// calendar has been loaded, so until now, onLoad events can be ignored:
this.alarmService.mLoadedCalendars[aCalendar.id] = true;
},
onGetResult: function(aCalendar, aStatus, aItemType, aDetail, aCount, aItems) {
for (var i = 0; i < aCount; ++i) {
var item = aItems[i];
// assure we don't fire alarms twice, handle removed alarms as far as we can:
// e.g. we cannot purge removed items from ics files. XXX todo.
this.alarmService.removeAlarm(item);
if (this.alarmService.hasAlarm(item)) {
this.alarmService.addAlarm(item);
}
@@ -445,33 +487,6 @@ dump("alarm is in the past, and unack'd, firing now!\n");
}
};
var now = jsDateToDateTime((new Date())).getInTimezone("UTC");
var start;
if (!this.mRangeEnd) {
// This is our first search for alarms. We're going to look for
// alarms +/- 1 month from now. If someone sets an alarm more than
// a month ahead of an event, or doesn't start Sunbird/Lightning
// for a month, they'll miss some, but that's a slim chance
start = now.clone();
start.month -= 1;
start.normalize();
} else {
// This is a subsequent search, so we got all the past alarms before
start = this.mRangeEnd.clone();
}
var until = now.clone();
until.month += 1;
until.normalize();
// We don't set timers for every future alarm, only those within 6 hours
var end = now.clone();
end.hour += kHoursBetweenUpdates;
end.normalize();
this.mRangeEnd = end.getInTimezone("UTC");
var calendarManager = this.calendarManager;
var calendars = calendarManager.getCalendars({});
const calICalendar = Components.interfaces.calICalendar;
var filter = calICalendar.ITEM_FILTER_COMPLETED_ALL |
calICalendar.ITEM_FILTER_CLASS_OCCURRENCES |
@@ -482,6 +497,20 @@ dump("alarm is in the past, and unack'd, firing now!\n");
}
},
initAlarms: function cas_refreshAlarms(calendars) {
// Total refresh similar to startup. We're going to look for
// alarms +/- 1 month from now. If someone sets an alarm more than
// a month ahead of an event, or doesn't start Sunbird/Lightning
// for a month, they'll miss some, but that's a slim chance
var start = jsDateToDateTime((new Date())).getInTimezone("UTC");
var until = start.clone();
start.month -= 1;
start.normalize();
until.month += 1;
until.normalize();
this.findAlarms(calendars, start, until);
},
alarmFired: function(event) {
if (event.calendar.suppressAlarms)
return;

View File

@@ -22,6 +22,7 @@
* Stuart Parmenter <stuart.parmenter@oracle.com>
* Matthew Willis <lilmatt@mozilla.com>
* Michiel van Leeuwen <mvl@exedo.nl>
* Martin Schroeder <mschroeder@mozilla.x-home.org>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
@@ -38,6 +39,7 @@
* ***** END LICENSE BLOCK ***** */
const SUNBIRD_UID = "{718e30fb-e89b-41dd-9da7-e25a45638b28}";
const LIGHTNING_UID = "{e2fda1a4-762b-4020-b5ad-a41df1933103}";
const kStorageServiceContractID = "@mozilla.org/storage/service;1";
const kStorageServiceIID = Components.interfaces.mozIStorageService;
@@ -306,30 +308,40 @@ calCalendarManager.prototype = {
// in the error message rather than blaming Thunderbird.
var appInfo = Components.classes["@mozilla.org/xre/app-info;1"]
.getService(Ci.nsIXULAppInfo);
var calAppName;
var errorBoxTitle;
var errorBoxText;
var errorBoxButtonLabel;
if (appInfo.ID == SUNBIRD_UID) {
calAppName = hostAppName;
errorBoxTitle = calSb.formatStringFromName("tooNewSchemaErrorBoxTitle",
[hostAppName], 1);
errorBoxText = calSb.formatStringFromName("tooNewSchemaErrorBoxTextSunbird",
[hostAppName], 1);
errorBoxButtonLabel = calSb.formatStringFromName("tooNewSchemaButtonQuit",
[hostAppName], 1);
} else {
lightningSb = sbs.createBundle("chrome://lightning/locale/lightning.properties");
calAppName = lightningSb.GetStringFromName("brandShortName");
var calAppName = lightningSb.GetStringFromName("brandShortName");
errorBoxTitle = calSb.formatStringFromName("tooNewSchemaErrorBoxTitle",
[calAppName], 1);
errorBoxText = calSb.formatStringFromName("tooNewSchemaErrorBoxTextLightning",
[calAppName, hostAppName], 2);
errorBoxButtonLabel = calSb.formatStringFromName("tooNewSchemaButtonRestart",
[hostAppName], 1);
}
var promptSvc = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
.getService(Components.interfaces.nsIPromptService);
buttonFlags = promptSvc.BUTTON_POS_0 *
promptSvc.BUTTON_TITLE_IS_STRING +
promptSvc.BUTTON_POS_0_DEFAULT;
var errorBoxButtonFlags = promptSvc.BUTTON_POS_0 *
promptSvc.BUTTON_TITLE_IS_STRING +
promptSvc.BUTTON_POS_0_DEFAULT;
var choice = promptSvc.confirmEx(
null,
calSb.formatStringFromName("tooNewSchemaErrorBoxTitle",
[calAppName], 1),
calSb.formatStringFromName("tooNewSchemaErrorBoxText",
[calAppName, hostAppName], 2),
buttonFlags,
calSb.formatStringFromName("tooNewSchemaButtonQuit",
[hostAppName], 1),
errorBoxTitle,
errorBoxText,
errorBoxButtonFlags,
errorBoxButtonLabel,
null, // No second button text
null, // No third button text
null, // No checkbox
@@ -338,7 +350,14 @@ calCalendarManager.prototype = {
if (choice == 0) {
var startup = Components.classes["@mozilla.org/toolkit/app-startup;1"]
.getService(Components.interfaces.nsIAppStartup);
startup.quit(Components.interfaces.nsIAppStartup.eForceQuit);
if (appInfo.ID == SUNBIRD_UID) {
startup.quit(Components.interfaces.nsIAppStartup.eForceQuit);
} else {
var em = Components.classes["@mozilla.org/extensions/manager;1"]
.getService(Components.interfaces.nsIExtensionManager);
em.disableItem(LIGHTNING_UID);
startup.quit(Components.interfaces.nsIAppStartup.eRestart | Components.interfaces.nsIAppStartup.eForceQuit);
}
}
}
}
@@ -622,7 +641,7 @@ function errorAnnouncer(calendar) {
// calIObserver:
onStartBatch: function() {},
onEndBatch: function() {},
onLoad: function() {},
onLoad: function(calendar) {},
onAddItem: function(aItem) {},
onModifyItem: function(aNewItem, aOldItem) {},
onDeleteItem: function(aDeletedItem) {},

View File

@@ -24,6 +24,7 @@
* Dan Mosedale <dan.mosedale@oracle.com>
* Michiel van Leeuwen <mvl@exedo.nl>
* Clint Talbert <cmtalbert@myfastmail.com>
* Daniel Boelzle <daniel.boelzle@sun.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
@@ -352,6 +353,8 @@ calDateTime::GetInTimezone(const nsACString& aTimezone, calIDateTime **aResult)
cdt = new calDateTime(*this);
if (!mTimezone.EqualsLiteral("floating"))
cdt->mTimezone.Assign(aTimezone);
} else if (mTimezone.Equals(aTimezone)) {
cdt = new calDateTime(*this);
} else {
struct icaltimetype icalt;
icaltimezone *tz = nsnull;
@@ -396,6 +399,8 @@ calDateTime::GetInTimezone(const nsACString& aTimezone, calIDateTime **aResult)
cdt = new calDateTime(&icalt);
}
if (!cdt)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF (*aResult = cdt);
return NS_OK;
}

View File

@@ -204,7 +204,8 @@ function formatDateTime(aDate) {
calDateTimeFormatter.prototype.formatInterval =
function formatInterval(aStartDate, aEndDate, aStartString, aEndString) {
var endDate = aEndDate.clone();
// make sure start and end use the same timezone when formatting intervals:
var endDate = aEndDate.getInTimezone(aStartDate.timezone);
// EndDate is exclusive. For all-day events, we ened to substract one day,
// to get into a format that's understandable.
if (aStartDate.isDate) {

View File

@@ -1402,7 +1402,7 @@ calICSService::GetTimezoneLongitude(const nsACString& tzid, nsACString& _retval)
NS_IMETHODIMP
calICSService::GetTzIdPrefix(nsACString& _retval)
{
_retval.Assign(gTzIdPrefix);
_retval.Assign(kTzIdPrefix);
return NS_OK;
}
@@ -1472,13 +1472,14 @@ calICSService::LatestTzId(const nsACString& tzid, nsACString& _retval) {
// If the zone's locale was not changed and the zone was not
// deleted (i.e. we haven't already created _retVal, then
// we just need to update the timestamp.
const nsCAutoString tzIdPrefix(kTzIdPrefix);
if ((_retval.Length() == 0) &&
(gTzIdPrefix != Substring(tzid, 0, prefixEnd + 1))) {
(tzIdPrefix != Substring(tzid, 0, prefixEnd + 1))) {
// TODO: This assumes that new zones will always be later. If we are
// ever going to support mixing our TZID headers, then this needs to
// be a date comparison.
_retval = gTzIdPrefix + Substring(tzid, prefixEnd + 1,
tzid.Length() - (prefixEnd + 1));
_retval = tzIdPrefix + Substring(tzid, prefixEnd + 1,
tzid.Length() - (prefixEnd + 1));
}
return NS_OK;
}

View File

@@ -333,7 +333,7 @@ calRecurrenceInfo.prototype = {
// internal helper function;
calculateDates: function (aRangeStart, aRangeEnd,
aMaxCount, aIncludeExceptions, aReturnRIDs)
aMaxCount, aReturnRIDs)
{
if (!this.mBaseItem)
throw Components.results.NS_ERROR_NOT_INITIALIZED;
@@ -363,8 +363,14 @@ calRecurrenceInfo.prototype = {
var startDate = this.mBaseItem.recurrenceStartDate;
var dates = [];
// DTSTART/DUE is always part of the (positive) expanded set:
// the base item cannot be replaced by an exception;
// an exception can only be defined on an item resulting from an RDATE/RRULE;
// DTSTART always equals RECURRENCE-ID for items expanded from RRULE
dates.push(startDate);
// toss in exceptions first:
if (aIncludeExceptions && this.mExceptions) {
if (this.mExceptions) {
this.mExceptions.forEach(function(ex) {
var dtstart = ex.item.getProperty("DTSTART");
var dateToReturn;
@@ -447,6 +453,12 @@ calRecurrenceInfo.prototype = {
dates = dates.filter(function (d) { return d.compare(dateToRemove) != 0; });
});
} else {
// XXX todo: IMO a bug here,
// if we are asked for DTSTART dates
// (aReturnRIDs is false => getOccurrenceDates),
// then pumping in the plain expanded rule dates is wrong,
// we need to take the "exception'ed" DTSTART dates
// if positive, we just add these date to the existing set,
// but only if they're not already there
var datesToAdd = [];
@@ -472,7 +484,7 @@ calRecurrenceInfo.prototype = {
getOccurrenceDates: function (aRangeStart, aRangeEnd,
aMaxCount, aCount)
{
var dates = this.calculateDates(aRangeStart, aRangeEnd, aMaxCount, true, false);
var dates = this.calculateDates(aRangeStart, aRangeEnd, aMaxCount, false);
aCount.value = dates.length;
return dates;
},
@@ -481,7 +493,7 @@ calRecurrenceInfo.prototype = {
aMaxCount,
aCount)
{
var dates = this.calculateDates(aRangeStart, aRangeEnd, aMaxCount, true, true);
var dates = this.calculateDates(aRangeStart, aRangeEnd, aMaxCount, true);
if (dates.length == 0) {
aCount.value = 0;
return [];

View File

@@ -21,6 +21,7 @@
*
* Contributor(s):
* Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
* Daniel Boelzle <daniel.boelzle@sun.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
@@ -168,7 +169,9 @@ calTodo.prototype = {
},
get recurrenceStartDate() {
return this.entryDate;
// DTSTART is optional for VTODOs, so it's unclear if RRULE is allowed then,
// so fallback to DUE if no DTSTART is present:
return this.entryDate || this.dueDate;
},
icsEventPropMap: [

View File

@@ -842,3 +842,220 @@ function isSunbird()
return appInfo.ID == kSUNBIRD_UID;
}
function showElement(elementId)
{
try {
document.getElementById(elementId).removeAttribute("hidden");
} catch (e) {
dump("showElement: Couldn't remove hidden attribute from " + elementId + "\n");
}
}
function hideElement(elementId)
{
try {
document.getElementById(elementId).setAttribute("hidden", "true");
} catch (e) {
dump("hideElement: Couldn't set hidden attribute on " + elementId + "\n");
}
}
function enableElement(elementId)
{
try {
//document.getElementById(elementId).setAttribute("disabled", "false");
// call remove attribute beacuse some widget code checks for the presense of a
// disabled attribute, not the value.
document.getElementById(elementId).removeAttribute("disabled");
} catch (e) {
dump("enableElement: Couldn't remove disabled attribute on " + elementId + "\n");
}
}
function disableElement(elementId)
{
try {
document.getElementById(elementId).setAttribute( "disabled", "true");
} catch (e) {
dump("disableElement: Couldn't set disabled attribute to true on " +
elementId + "\n");
}
}
/**
* Helper function for filling the form,
* Set the value of a property of a XUL element
*
* PARAMETERS
* elementId - ID of XUL element to set
* newValue - value to set property to ( if undefined no change is made )
* propertyName - OPTIONAL name of property to set, default is "value",
* use "checked" for radios & checkboxes, "data" for
* drop-downs
*/
function setElementValue(elementId, newValue, propertyName)
{
var undefined;
if (newValue !== undefined) {
var field = document.getElementById(elementId);
if (newValue === false) {
try {
field.removeAttribute(propertyName);
} catch (e) {
dump("setFieldValue: field.removeAttribute couldn't remove " +
propertyName + " from " + elementId + " e: " + e + "\n");
}
} else if (propertyName) {
try {
field.setAttribute(propertyName, newValue);
} catch (e) {
dump("setFieldValue: field.setAttribute couldn't set " +
propertyName + " from " + elementId + " to " + newValue +
" e: " + e + "\n");
}
} else {
field.value = newValue;
}
}
}
/**
* Helper function for getting data from the form,
* Get the value of a property of a XUL element
*
* PARAMETERS
* elementId - ID of XUL element to get from
* propertyName - OPTIONAL name of property to set, default is "value",
* use "checked" for radios & checkboxes, "data" for
* drop-downs
* RETURN
* newValue - value of property
*/
function getElementValue(elementId, propertyName)
{
var field = document.getElementById(elementId);
if (propertyName) {
return field[propertyName];
}
return field.value;
}
function processEnableCheckbox(checkboxId, elementId)
{
if (document.getElementById(checkboxId).checked) {
enableElement(elementId);
} else {
disableElement(elementId);
}
}
/*
* Enable/disable button if there are children in a listbox
*/
function updateListboxDeleteButton(listboxId, buttonId)
{
if (document.getElementById(listboxId).getRowCount() > 0) {
enableElement(buttonId);
} else {
disableElement(buttonId);
}
}
/*
* Update plural singular menu items
*/
function updateMenuLabels(lengthFieldId, menuId )
{
var field = document.getElementById(lengthFieldId);
var menu = document.getElementById(menuId);
// figure out whether we should use singular or plural
var length = field.value;
var newLabelNumber;
// XXX This assumes that "0 days, minutes, etc." is plural in other languages.
if ( (Number(length) == 0) || (Number(length) > 1) ) {
newLabelNumber = "label2"
} else {
newLabelNumber = "label1"
}
// see what we currently show and change it if required
var oldLabelNumber = menu.getAttribute("labelnumber");
if (newLabelNumber != oldLabelNumber) {
// remember what we are showing now
menu.setAttribute("labelnumber", newLabelNumber);
// update the menu items
var items = menu.getElementsByTagName("menuitem");
for(var i = 0; i < items.length; ++i) {
var menuItem = items[i];
var newLabel = menuItem.getAttribute(newLabelNumber);
menuItem.label = newLabel;
menuItem.setAttribute("label", newLabel);
}
// force the menu selection to redraw
var saveSelectedIndex = menu.selectedIndex;
menu.selectedIndex = -1;
menu.selectedIndex = saveSelectedIndex;
}
}
/** Select value in menuList. Throws string if no such value. **/
function menuListSelectItem(menuListId, value)
{
var menuList = document.getElementById(menuListId);
var index = menuListIndexOf(menuList, value);
if (index != -1) {
menuList.selectedIndex = index;
} else {
throw "menuListSelectItem: No such Element: "+value;
}
}
/** Find index of menuitem with the given value, or return -1 if not found. **/
function menuListIndexOf(menuList, value)
{
var items = menuList.menupopup.childNodes;
var index = -1;
for (var i = 0; i < items.length; i++) {
var element = items[i];
if (element.nodeName == "menuitem") {
index++;
}
if (element.getAttribute("value") == value) {
return index;
}
}
return -1; // not found
}
function hasPositiveIntegerValue(elementId)
{
var value = document.getElementById(elementId).value;
if (value && (parseInt(value) == value) && value > 0) {
return true;
}
return false;
}

View File

@@ -167,7 +167,7 @@ print TZDATA <<EOF
};
// needed for implementing calIICSService.tzIdPrefix
NS_NAMED_LITERAL_CSTRING(gTzIdPrefix, "${TZ_PREFIX}/");
const char kTzIdPrefix[] = "${TZ_PREFIX}/";
EOF
;

View File

@@ -2435,4 +2435,4 @@ static ical_timezone_data_struct ical_timezone_data[] = {
};
// needed for implementing calIICSService.tzIdPrefix
NS_NAMED_LITERAL_CSTRING(gTzIdPrefix, "/mozilla.org/20070129_1/");
const char kTzIdPrefix[] = "/mozilla.org/20070129_1/";

Binary file not shown.

Before

Width:  |  Height:  |  Size: 204 B

After

Width:  |  Height:  |  Size: 179 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 228 B

After

Width:  |  Height:  |  Size: 209 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 226 B

After

Width:  |  Height:  |  Size: 210 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 201 B

After

Width:  |  Height:  |  Size: 178 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 585 B

After

Width:  |  Height:  |  Size: 280 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 211 B

After

Width:  |  Height:  |  Size: 184 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 177 B

After

Width:  |  Height:  |  Size: 164 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 179 B

After

Width:  |  Height:  |  Size: 164 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 212 B

After

Width:  |  Height:  |  Size: 205 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 207 B

After

Width:  |  Height:  |  Size: 206 B

View File

@@ -196,7 +196,7 @@ toolbar[iconsize="small"] #calendar-choose-date-button[disabled="true"] {
#calendar-multiweek-view-button:active {
-moz-image-region: rect(32px 192px 64px 160px);
}
#calendar-multiweek-view-button[disabled="true"] {
#calendar-multiweek-view-button[checked="true"] {
-moz-image-region: rect(96px 192px 128px 160px);
}
@@ -207,7 +207,7 @@ toolbar[iconsize="small"] #calendar-multiweek-view-button {
toolbar[iconsize="small"] #calendar-multiweek-view-button:active {
-moz-image-region: rect(24px 144px 48px 120px);
}
toolbar[iconsize="small"] #calendar-multiweek-view-button[disabled="true"] {
toolbar[iconsize="small"] #calendar-multiweek-view-button[checked="true"] {
-moz-image-region: rect(72px 144px 96px 120px);
}
@@ -222,7 +222,7 @@ toolbar[iconsize="small"] #calendar-multiweek-view-button[disabled="true"] {
-moz-image-region: rect(32px 224px 64px 192px);
}
#calendar-month-view-button:hover:active,
#calendar-month-view-button[disabled="true"] {
#calendar-month-view-button[checked="true"] {
-moz-image-region: rect(96px 224px 128px 192px);
color: ButtonText;
}
@@ -234,7 +234,7 @@ toolbar[iconsize="small"] #calendar-month-view-button {
toolbar[iconsize="small"] #calendar-month-view-button:active {
-moz-image-region: rect(24px 168px 48px 144px);
}
toolbar[iconsize="small"] #calendar-month-view-button[disabled="true"] {
toolbar[iconsize="small"] #calendar-month-view-button[checked="true"] {
-moz-image-region: rect(72px 168px 96px 144px);
}
@@ -249,7 +249,7 @@ toolbar[iconsize="small"] #calendar-month-view-button[disabled="true"] {
-moz-image-region: rect(32px 160px 64px 128px);
}
#calendar-week-view-button:hover:active,
#calendar-week-view-button[disabled="true"] {
#calendar-week-view-button[checked="true"] {
-moz-image-region: rect(96px 160px 128px 128px);
}
@@ -261,7 +261,7 @@ toolbar[iconsize="small"] #calendar-week-view-button:active {
-moz-image-region: rect(24px 120px 48px 96px);
}
toolbar[iconsize="small"] #calendar-week-view-button:hover:active,
toolbar[iconsize="small"] #calendar-week-view-button[disabled="true"] {
toolbar[iconsize="small"] #calendar-week-view-button[checked="true"] {
-moz-image-region: rect(72px 120px 96px 96px);
}
@@ -276,7 +276,7 @@ toolbar[iconsize="small"] #calendar-week-view-button[disabled="true"] {
-moz-image-region: rect(32px 128px 64px 96px);
}
#calendar-day-view-button:hover:active,
#calendar-day-view-button[disabled="true"] {
#calendar-day-view-button[checked="true"] {
-moz-image-region: rect(96px 128px 128px 96px);
}
@@ -288,7 +288,7 @@ toolbar[iconsize="small"] #calendar-day-view-button:active {
-moz-image-region: rect(24px 96px 48px 72px);
}
toolbar[iconsize="small"] #calendar-day-view-button:hover:active,
toolbar[iconsize="small"] #calendar-day-view-button[disabled="true"] {
toolbar[iconsize="small"] #calendar-day-view-button[checked="true"] {
-moz-image-region: rect(72px 96px 96px 72px);
}

View File

@@ -22,6 +22,7 @@
* Vladimir Vukicevic <vladimir@pobox.com>
* Joey Minta <jminta@gmail.com>
* Michiel van Leeuwen <mvl@exedo.nl>
* Philipp Kewisch <mozilla@kewis.ch>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
@@ -267,7 +268,7 @@ calendar-multiday-view[hidden="true"] {
display: none;
}
.calendar-day-label-box {
calendar-day-label {
color: #3F7D91;
background: #E7EEEC;
border-top: 1px solid #3F7D91;

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -256,8 +256,8 @@ toolbar[iconsize="small"] #calendar-choose-date-button:hover:active {
-moz-image-region: rect(24px 144px 48px 120px);
}
#calendar-multiweek-view-button:hover:active,
#calendar-multiweek-view-button[disabled="true"],
#calendar-multiweek-view-button[disabled="true"]:hover {
#calendar-multiweek-view-button[checked="true"],
#calendar-multiweek-view-button[checked="true"]:hover {
-moz-image-region: rect(72px 144px 96px 120px);
border-color: ThreeDShadow ThreeDHighlight ThreeDHighlight ThreeDShadow;
padding: 5px 3px 3px 5px;
@@ -274,8 +274,8 @@ toolbar[iconsize="small"] #calendar-multiweek-view-button:hover {
-moz-image-region: rect(16px 96px 32px 80px);
}
toolbar[iconsize="small"] #calendar-multiweek-view-button:hover:active,
toolbar[iconsize="small"] #calendar-multiweek-view-button[disabled="true"],
toolbar[iconsize="small"] #calendar-multiweek-view-button[disabled="true"]:hover {
toolbar[iconsize="small"] #calendar-multiweek-view-button[checked="true"],
toolbar[iconsize="small"] #calendar-multiweek-view-button[checked="true"]:hover {
-moz-image-region: rect(48px 96px 64px 80px);
}
@@ -290,8 +290,8 @@ toolbar[iconsize="small"] #calendar-multiweek-view-button[disabled="true"]:hover
-moz-image-region: rect(24px 168px 48px 144px);
}
#calendar-month-view-button:hover:active,
#calendar-month-view-button[disabled="true"],
#calendar-month-view-button[disabled="true"]:hover {
#calendar-month-view-button[checked="true"],
#calendar-month-view-button[checked="true"]:hover {
-moz-image-region: rect(72px 168px 96px 144px);
border-color: ThreeDShadow ThreeDHighlight ThreeDHighlight ThreeDShadow;
padding: 5px 3px 3px 5px;
@@ -309,8 +309,8 @@ toolbar[iconsize="small"] #calendar-month-view-button:hover {
-moz-image-region: rect(16px 112px 32px 96px);
}
toolbar[iconsize="small"] #calendar-month-view-button:hover:active,
toolbar[iconsize="small"] #calendar-month-view-button[disabled="true"],
toolbar[iconsize="small"] #calendar-month-view-button[disabled="true"]:hover {
toolbar[iconsize="small"] #calendar-month-view-button[checked="true"],
toolbar[iconsize="small"] #calendar-month-view-button[checked="true"]:hover {
-moz-image-region: rect(48px 112px 64px 96px);
}
@@ -325,8 +325,8 @@ toolbar[iconsize="small"] #calendar-month-view-button[disabled="true"]:hover {
-moz-image-region: rect(24px 120px 48px 96px);
}
#calendar-week-view-button:hover:active,
#calendar-week-view-button[disabled="true"],
#calendar-week-view-button[disabled="true"]:hover {
#calendar-week-view-button[checked="true"],
#calendar-week-view-button[checked="true"]:hover {
-moz-image-region: rect(72px 120px 96px 96px);
border-color: ThreeDShadow ThreeDHighlight ThreeDHighlight ThreeDShadow;
padding: 5px 3px 3px 5px;
@@ -344,8 +344,8 @@ toolbar[iconsize="small"] #calendar-week-view-button:hover {
-moz-image-region: rect(16px 80px 32px 64px);
}
toolbar[iconsize="small"] #calendar-week-view-button:hover:active,
toolbar[iconsize="small"] #calendar-week-view-button[disabled="true"],
toolbar[iconsize="small"] #calendar-week-view-button[disabled="true"]:hover {
toolbar[iconsize="small"] #calendar-week-view-button[checked="true"],
toolbar[iconsize="small"] #calendar-week-view-button[checked="true"]:hover {
-moz-image-region: rect(48px 80px 64px 64px);
}
@@ -360,8 +360,8 @@ toolbar[iconsize="small"] #calendar-week-view-button[disabled="true"]:hover {
-moz-image-region: rect(24px 96px 48px 72px);
}
#calendar-day-view-button:hover:active,
#calendar-day-view-button[disabled="true"],
#calendar-day-view-button[disabled="true"]:hover {
#calendar-day-view-button[checked="true"],
#calendar-day-view-button[checked="true"]:hover {
-moz-image-region: rect(72px 96px 96px 72px);
border-color: ThreeDShadow ThreeDHighlight ThreeDHighlight ThreeDShadow;
padding: 5px 3px 3px 5px;
@@ -379,8 +379,8 @@ toolbar[iconsize="small"] #calendar-day-view-button:hover {
-moz-image-region: rect(16px 64px 32px 48px);
}
toolbar[iconsize="small"] #calendar-day-view-button:hover:active,
toolbar[iconsize="small"] #calendar-day-view-button[disabled="true"],
toolbar[iconsize="small"] #calendar-day-view-button[disabled="true"]:hover {
toolbar[iconsize="small"] #calendar-day-view-button[checked="true"],
toolbar[iconsize="small"] #calendar-day-view-button[checked="true"]:hover {
-moz-image-region: rect(48px 64px 64px 48px);
}

View File

@@ -22,6 +22,7 @@
* Vladimir Vukicevic <vladimir@pobox.com>
* Joey Minta <jminta@gmail.com>
* Michiel van Leeuwen <mvl@exedo.nl>
* Philipp Kewisch <mozilla@kewis.ch>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
@@ -267,7 +268,7 @@ calendar-multiday-view[hidden="true"] {
display: none;
}
.calendar-day-label-box {
calendar-day-label {
color: #3F7D91;
background: #E7EEEC;
border-top: 1px solid #3F7D91;

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -119,6 +119,7 @@ function html_exportToStream(aStream, aCount, aItems, aTitle) {
var prefixWhen = calGetString("calendar", "htmlPrefixWhen");
var prefixLocation = calGetString("calendar", "htmlPrefixLocation");
var prefixDescription = calGetString("calendar", "htmlPrefixDescription");
var defaultTimezone = calendarDefaultTimezone();
for (var pos = 0; pos < aItems.length; ++pos) {
var item = aItems[pos];
@@ -137,6 +138,12 @@ function html_exportToStream(aStream, aCount, aItems, aTitle) {
var startDate = calGetStartDate(item);
var endDate = calGetEndDate(item);
if (startDate) {
startDate = startDate.getInTimezone(defaultTimezone);
}
if (endDate) {
endDate = endDate.getInTimezone(defaultTimezone);
}
// Start and end
var startstr = new Object();

View File

@@ -303,9 +303,16 @@ function makeHTMLWeek(date, sortedList, targetMonth) {
<td valign='top' align='left'>{date.day}</td>
</tr>
innerTable.appendChild(dateLabel);
var defaultTimezone = calendarDefaultTimezone();
for each (var item in sortedList) {
var sDate = item.startDate || item.entryDate || item.dueDate;
var eDate = item.endDate || item.dueDate || item.entryDate;
if (sDate) {
sDate = sDate.getInTimezone(defaultTimezone);
}
if (eDate) {
eDate = eDate.getInTimezone(defaultTimezone);
}
// end dates are exclusive
if (sDate.isDate) {
@@ -323,19 +330,9 @@ function makeHTMLWeek(date, sortedList, targetMonth) {
var dateFormatter =
Components.classes["@mozilla.org/calendar/datetime-formatter;1"]
.getService(Components.interfaces.calIDateTimeFormatter);
function getStringForDate(date) {
var dstring;
if (!date.isDate) {
return dateFormatter.formatTime(sDate);
}
return calGetString("dateFormat", "AllDay");
}
var time;
if (sDate) {
time = getStringForDate(sDate);
var time = "";
if (!sDate.isDate) {
time = dateFormatter.formatTime(sDate);
}
var calMgr = Components.classes["@mozilla.org/calendar/manager;1"]

View File

@@ -112,9 +112,6 @@ function weekPrint_format(aStream, aStart, aEnd, aCount, aItems, aTitle) {
var weekFormatter = Components.classes["@mozilla.org/calendar/weektitle-service;1"]
.getService(Components.interfaces.calIWeekTitleService);
// A place to cache the string for "All Day" events later if we need it.
var mAllDayString = null;
// Start at the beginning of the week that aStart is in, and loop until
// we're at aEnd. In the loop we build the HTML table for each day, and
// get the day's items using getDayTd().
@@ -209,7 +206,8 @@ function weekPrint_getDayTable(aDate, aItems) {
var mainTd = <td border='1px solid black;' width="50%" valign='top'/>
var dateFormatter = Components.classes["@mozilla.org/calendar/datetime-formatter;1"]
.getService(Components.interfaces.calIDateTimeFormatter);
var dateString = dateFormatter.formatDateLong(aDate);
var defaultTimezone = calendarDefaultTimezone();
var dateString = dateFormatter.formatDateLong(aDate.getInTimezone(defaultTimezone));
// Add the formatted date string (in its own child HTML table)
mainTd.appendChild(
@@ -224,6 +222,12 @@ function weekPrint_getDayTable(aDate, aItems) {
for each (var item in aItems) {
var sDate = item.startDate || item.entryDate || item.dueDate;
var eDate = item.endDate || item.dueDate || item.entryDate;
if (sDate) {
sDate = sDate.getInTimezone(defaultTimezone);
}
if (eDate) {
eDate = eDate.getInTimezone(defaultTimezone);
}
// End dates are exclusive. Adjust the eDate accordingly.
if (sDate && sDate.isDate && eDate) {
@@ -243,29 +247,13 @@ function weekPrint_getDayTable(aDate, aItems) {
break;
}
function getStringForDate(aDate) {
if (!aDate.isDate) {
return dateFormatter.formatTime(aDate);
}
// We cache the string for "All Day" 'cause we're good like that.
if (this.mAllDayString == null) {
this.mAllDayString = calGetString("dateFormat", "AllDay");
}
return this.mAllDayString;
}
var time;
if (sDate && eDate) {
if (!sDate.isDate) {
time = getStringForDate(sDate) + '-' + getStringForDate(eDate);
} else {
time = getStringForDate(sDate);
}
} else if (sDate) {
time = getStringForDate(sDate);
} else if (eDate) {
time = getStringForDate(eDate);
var time = "";
if (sDate && eDate && !sDate.isDate) {
time = dateFormatter.formatTime(sDate) + '-' + dateFormatter.formatTime(eDate);
} else if (sDate && !sDate.isDate) {
time = dateFormatter.formatTime(sDate);
} else if (eDate && !eDate.isDate) {
time = dateFormatter.formatTime(eDate);
}
// Get calendar and category colours and apply them to the item's

View File

@@ -72,6 +72,7 @@ chrome/calendar-wen-DE.jar
chrome/help.jar
chrome/pipnss.jar
components/browser.xpt
components/feedProcessor.js
components/nsSetDefaultBrowser.js
defaults/profile/mimeTypes.rdf
extensions/{8af2d0a7-e394-4de2-ae55-2dae532a7a9b}/install.rdf

View File

@@ -59,7 +59,6 @@ bin\components\appshell.xpt
bin\components\appstartup.xpt
bin\components\autocomplete.xpt
bin\components\autoconfig.xpt
bin\components\bookmarks.xpt
bin\components\calbase.xpt
bin\components\calbaseinternal.xpt
bin\components\caps.xpt
@@ -208,7 +207,6 @@ bin\components\calItemModule.js
bin\components\calMemoryCalendar.js
bin\components\calStorageCalendar.js
bin\components\calWcapCalendarModule.js
bin\components\FeedProcessor.js
bin\components\jsconsole-clhandler.js
bin\components\pluginGlue.js
bin\js\calAlarmService.js

View File

@@ -938,11 +938,15 @@ icalcomponent* icalparser_add_line(icalparser* parser,
from rfc2445. Also added the x-properties, because the spec actually
says that commas should be escaped. For x-properties, other apps may
depend on that behaviour
Referring to RFC 2445, section 4.8.5.3 and section 4.8.5.1:
RDATE and EXDATE can specify a list of dates/date-times/periods.
*/
switch (prop_kind) {
case ICAL_X_PROPERTY:
case ICAL_CATEGORIES_PROPERTY:
case ICAL_RESOURCES_PROPERTY:
case ICAL_RDATE_PROPERTY:
case ICAL_EXDATE_PROPERTY:
str = icalparser_get_next_value(end,&end, value_kind);
break;
default:

View File

@@ -10,7 +10,8 @@ overlay chrome://messenger/content/preferences/preferences.xul chrome://calendar
overlay chrome://messenger/content/preferences/preferences.xul chrome://calendar/content/preferences/general.xul
overlay chrome://messenger/content/preferences/preferences.xul chrome://calendar/content/preferences/timezones.xul
overlay chrome://messenger/content/preferences/preferences.xul chrome://calendar/content/preferences/views.xul
overlay chrome://messenger/content/messenger.xul chrome://lightning/content/messenger-overlay-toolbar.xul
overlay chrome://messenger/content/mailWindowOverlay.xul chrome://lightning/content/messenger-overlay-toolbar.xul
overlay chrome://global/content/customizeToolbar.xul chrome://lightning/content/customize-toolbar.xul
overlay chrome://lightning/content/messenger-overlay-sidebar.xul chrome://lightning/content/agenda-tree-overlay.xul
overlay chrome://lightning/content/messenger-overlay-sidebar.xul chrome://lightning/content/todo-list-overlay.xul
overlay chrome://lightning/content/lightning-standalone.xul chrome://lightning/content/messenger-overlay-sidebar.xul

View File

@@ -27,6 +27,7 @@
* gekacheka@yahoo.com
* richard@duif.net
* Matthew Willis <mattwillis@gmail.com>
* Markus Adrario <MarkusAdrario@web.de>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
@@ -412,8 +413,13 @@ function listener_onGetResult(calendar, status, itemtype, detail, count, items)
agendaTreeView.refreshCalendarQuery =
function refreshCalendarQuery()
{
var filter = this.calendar.ITEM_FILTER_COMPLETED_ALL |
this.calendar.ITEM_FILTER_CLASS_OCCURRENCES;
var filter = this.calendar.ITEM_FILTER_CLASS_OCCURRENCES;
if (document.getElementById("completed-tasks-checkbox").checked) {
filter = this.calendar.ITEM_FILTER_COMPLETED_ALL;
} else {
filter = this.calendar.ITEM_FILTER_COMPLETED_NO;
}
if (!this.filterType)
this.filterType = 'all';
switch (this.filterType) {
@@ -495,7 +501,7 @@ agendaTreeView.calendarObserver.onEndBatch = function() {
this.agendaTreeView.refreshCalendarQuery();
}
};
agendaTreeView.calendarObserver.onLoad = function() {
agendaTreeView.calendarObserver.onLoad = function(calendar) {
this.agendaTreeView.refreshCalendarQuery();
};
@@ -505,6 +511,14 @@ function observer_onAddItem(item)
if (this.mBatchCount) {
return;
}
if (isToDo(item)) {
var showCompleted = document.getElementById("completed-tasks-checkbox").checked;
if (item.isCompleted && !showCompleted) {
return;
}
}
var occs = item.getOccurrencesBetween(this.agendaTreeView.today.start,
this.agendaTreeView.soon.end, {});
occs.forEach(this.agendaTreeView.addItem, this.agendaTreeView);
@@ -531,6 +545,13 @@ function observer_onModifyItem(newItem, oldItem)
return;
}
this.onDeleteItem(oldItem, "no-rebuild");
if (isToDo(newItem)) {
var showCompleted = document.getElementById("completed-tasks-checkbox").checked;
if (newItem.isCompleted && !showCompleted) {
return;
}
}
this.onAddItem(newItem);
};

View File

@@ -148,7 +148,7 @@ var ltnCompositeCalendarObserver = {
// calIObserver
onStartBatch: function() { },
onEndBatch: function() { },
onLoad: function() { },
onLoad: function(aCalendar) { },
onAddItem: function(aItem) { },
onModifyItem: function(aNewItem, aOldItem) { },
onDeleteItem: function(aDeletedItem) { },

View File

@@ -83,7 +83,8 @@
if (!(aItem instanceof Components.interfaces.calITodo) ||
this.mBatchCount)
return;
this.todoList.addTodo(aItem);
if (this.todoList.mShowCompleted || !aItem.isCompleted)
this.todoList.addTodo(aItem);
},
onDeleteItem: function onDeleteItem(aItem)
@@ -91,7 +92,8 @@
if (!(aItem instanceof Components.interfaces.calITodo) ||
this.mBatchCount)
return;
this.todoList.removeTodo(aItem);
if (this.todoList.mShowCompleted || !aItem.isCompleted)
this.todoList.removeTodo(aItem);
},
onModifyItem: function onModifyItem(aNewItem, aOldItem)
@@ -100,7 +102,8 @@
this.mBatchCount)
return;
this.todoList.removeTodo(aOldItem);
this.todoList.addTodo(aNewItem);
if (this.todoList.mShowCompleted || !aNewItem.isCompleted)
this.todoList.addTodo(aNewItem);
},
onError: function onError(aErrNo, aMessage)
@@ -188,6 +191,12 @@
<method name="addTodo">
<parameter name="aTodo"/>
<body><![CDATA[
for (var i=0; i < this.childNodes.length; i++) {
var elem = this.childNodes[i];
if (elem.todo.hasSameIds(aTodo)) {
return;
}
}
void("adding new todo " + aTodo.title + "\n");
var newTodoElt = document.createElement("calendar-todo-item");
newTodoElt.setAttribute("item-calendar", aTodo.calendar.uri.spec);

View File

@@ -0,0 +1,324 @@
/* -*- Mode: javascript; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Communicator client code, released
* March 31, 1998.
*
* The Initial Developer of the Original Code is
* David Hyatt.
* Portions created by the Initial Developer are Copyright (C) 2002
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* David Hyatt (hyatt@apple.com)
* Blake Ross (blaker@netscape.com)
* Joe Hewitt (hewitt@netscape.com)
* Michael Buettner <michael.buettner@sun.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
/**
* Global variables in addition to those specified in
* mail/base/content/customizeToolbar.js
*/
var gPreviousLocation = null;
var gRepositionOnce = false;
/**
* Since we want to 'inherit' several global functions
* we retrieve the current values in order to call them
* from their overriden version.
*/
var gOnLoad = onLoad;
var gInitDialog = initDialog;
var gOnCancel = onCancel;
/**
* initDialog() gets called from the load handler and
* is responsible for initializing global variables, etc.
*/
initDialog = function()
{
// remember initialo toolbar location and set the
// menulist accordingly. this applies to the mode toolbar only.
gPreviousLocation = gToolbox.getAttribute("location");
document.getElementById("loction-list").value = gPreviousLocation;
// set the toolbar selection according to the current mode.
// this list allows to hop from one toolbar to another without
// leaving the customize dialog.
document.getElementById("selector-list").value = window.arguments[3];
// now call the original initDialog() function
gInitDialog();
}
/**
* onCancel() is called if the customize toolbar dialog has been canceled.
* we're returning to the previous state and discarding any changes made
* to the current toolbar. please note that this applies to the current toolbar
* only. in case we've been switched from one to another, only the changes
* made to the most recent toolbar will be discarded.
*/
onCancel = function()
{
updateToolbarLocation(gPreviousLocation);
gOnCancel();
}
/**
* repositionDialog() to find a good position for the customize dialog.
* it is called during initialization and subsequently if any option has been
* altered that causes the toolbar to change size or location. we need to
* override this function to add the ability to set the position *above*
* the toolbar in question, since this is necessary for the mode toolbar
* which is set at the lower left of the application window by default.
*/
function repositionDialog()
{
// Christian said it's better to not make the dialog jump...
if (gRepositionOnce)
return;
gRepositionOnce = true;
// Position the dialog touching the bottom of the toolbox and centered with
// it. We must resize the window smaller first so that it is positioned properly.
var screenX = gToolbox.boxObject.screenX + ((gToolbox.boxObject.width - kWindowWidth) / 2);
var screenY = gToolbox.boxObject.screenY + gToolbox.boxObject.height;
var newHeight = kWindowHeight;
if (newHeight >= screen.availHeight - screenY - kVSizeSlop) {
// the customize window doesn't fit below the toolbar. first try if there's
// enough space at the top of the toolbar. if neither works, shrink the height.
if(gToolbox.boxObject.screenY - newHeight - kVSizeSlop < 0) {
newHeight = screen.availHeight - screenY - kVSizeSlop;
} else {
screenY = gToolbox.boxObject.screenY - newHeight;
}
}
if(screenX < 0) {
screenX = 0;
}
window.resizeTo(kWindowWidth, newHeight);
window.moveTo(screenX, screenY);
}
/**
* onLoad() is called by the load event handler. we need to override
* this function to initialize the newly introduced controls.
*/
onLoad = function()
{
// remove the box containing all the relevant controls from
// the dom tree, we bring a new one to the table. this is necessary
// since those controls don't specify id's, so we need to override
// all of them.
var mainbox = document.getElementById("main-box");
var controlbox = document.getElementById("control-box");
mainbox.removeChild(controlbox.nextSibling);
// show the location option (place toolbar at top or bottom)
// if this feature has been requested.
updateLocationVisibility(window.arguments[3] == 'mode');
// now call the default implementation of the load handler, since
// this retrieves the toolbox element from the arguments.
gOnLoad();
}
/**
* updateToolbarLocation() is called to handle a new location for
* the toolbar (top or bottom). basically, we just set the appropriate
* attribute on all customizable toolbars and rely on them intercepting
* this modification and act accordingly.
*/
function updateToolbarLocation(aLocation)
{
// since the current toolbar will change its location in
// the dom tree (most probably), we need to unwrap the toolbar items
// and reset anything that could get in the way.
removeToolboxListeners();
unwrapToolbarItems(false);
var toolboxId = gToolbox.id;
// set the new location on the toolbox...
setAttribute(gToolbox, "location", aLocation);
gToolboxDocument.persist(gToolbox.id, "location");
// ...and each customizable toolbar
for (var i = 0; i < gToolbox.childNodes.length; ++i) {
var toolbar = getToolbarAt(i);
if (isCustomizableToolbar(toolbar)) {
setAttribute(toolbar, "location", aLocation);
gToolboxDocument.persist(toolbar.id, "location");
}
}
gToolbox = gToolboxDocument.getElementById(toolboxId);
gToolboxDocument = gToolbox.ownerDocument;
gToolbox.addEventListener("draggesture", onToolbarDragGesture, false);
gToolbox.addEventListener("dragover", onToolbarDragOver, false);
gToolbox.addEventListener("dragexit", onToolbarDragExit, false);
gToolbox.addEventListener("dragdrop", onToolbarDragDrop, false);
// Now re-wrap the items on the toolbar, but don't clobber previousset.
wrapToolbarItems(false);
}
/**
* Handler that takes care of a new toolbar being selected for customization.
*/
function updateToolbarSelection(aSelection)
{
var callback = window.arguments[2];
if(callback) {
// first of all, we need to remove our listeners and unwrap
// the toolbar items. this is important to do first, before calling
// the outside world, since they possibly want to change those items...
removeToolboxListeners();
unwrapToolbarItems(true);
// persist the current set of buttons in all
// customizable toolbars to localstore.
persistCurrentSets();
// execute the supplied callback function. we expect to receive
// the toolbox we're supposed to customize as a result.
var toolbox = callback(aSelection);
// store some internal states in the window arguments
// since we're going to call initDialog() again...
window.arguments[0] = toolbox;
window.arguments[3] = aSelection;
// show or hide the location menu dependend
// on the toolbar we're switching to.
updateLocationVisibility(aSelection == 'mode');
// nothing has changed so far...
gToolboxChanged = false;
// now just call the default load handler in order to
// initialize the dialog for a fresh start.
gOnLoad();
}
}
/**
* Show or hide the location selection, this option shouldn't be always visible
*/
function updateLocationVisibility(aShow)
{
var controls = document.getElementsByAttribute("location-option", "true");
for (var i=0;i<controls.length;i++) {
if (aShow) {
controls[i].removeAttribute("collapsed");
} else {
controls[i].setAttribute("collapsed","true");
}
}
}
/**
* Builds the palette of draggable items that are not yet in a toolbar.
*/
function buildPalette()
{
// Empty the palette first.
var paletteBox = document.getElementById("palette-box");
while (paletteBox.lastChild)
paletteBox.removeChild(paletteBox.lastChild);
var currentRow = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
"hbox");
currentRow.setAttribute("class", "paletteRow");
// Add the toolbar separator item.
var templateNode = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
"toolbarseparator");
templateNode.id = "separator";
wrapPaletteItem(templateNode, currentRow, null);
// Add the toolbar spring item.
templateNode = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
"toolbarspring");
templateNode.id = "spring";
templateNode.flex = 1;
wrapPaletteItem(templateNode, currentRow, null);
// Add the toolbar spacer item.
templateNode = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
"toolbarspacer");
templateNode.id = "spacer";
templateNode.flex = 1;
wrapPaletteItem(templateNode, currentRow, null);
var rowSlot = 3;
var currentItems = getCurrentItemIds();
templateNode = gToolbox.palette.firstChild;
while (templateNode) {
// Check if the item is already in a toolbar before adding it to the palette.
if (!(templateNode.id in currentItems)) {
var nodeMode = templateNode.getAttribute('mode');
if (!nodeMode)
nodeMode = 'mail';
if (nodeMode == window.arguments[3]) {
var paletteItem = templateNode.cloneNode(true);
if (rowSlot == kRowMax) {
// Append the old row.
paletteBox.appendChild(currentRow);
// Make a new row.
currentRow = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
"hbox");
currentRow.setAttribute("class", "paletteRow");
rowSlot = 0;
}
++rowSlot;
wrapPaletteItem(paletteItem, currentRow, null);
}
}
templateNode = templateNode.nextSibling;
}
if (currentRow) {
fillRowWithFlex(currentRow);
paletteBox.appendChild(currentRow);
}
}

View File

@@ -0,0 +1,100 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- ***** BEGIN LICENSE BLOCK *****
- Version: MPL 1.1/GPL 2.0/LGPL 2.1
-
- The contents of this file are subject to the Mozilla Public License Version
- 1.1 (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS" basis,
- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- for the specific language governing rights and limitations under the
- License.
-
- The Original Code is Mozilla Communicator client code, released
- March 31, 1998.
-
- The Initial Developer of the Original Code is
- Netscape Communications Corporation.
- Portions created by the Initial Developer are Copyright (C) 1998-1999
- the Initial Developer. All Rights Reserved.
-
- Contributor(s):
- David Hyatt (hyatt@apple.com)
- Blake Ross (blaker@netscape.com)
- Michael Buettner <michael.buettner@sun.com>
-
- Alternatively, the contents of this file may be used under the terms of
- either the GNU General Public License Version 2 or later (the "GPL"), or
- the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- in which case the provisions of the GPL or the LGPL are applicable instead
- of those above. If you wish to allow use of your version of this file only
- under the terms of either the GPL or the LGPL, and not to allow others to
- use your version of this file under the terms of the MPL, indicate your
- decision by deleting the provisions above and replace them with the notice
- and other provisions required by the LGPL or the GPL. If you do not delete
- the provisions above, a recipient may use your version of this file under
- the terms of any one of the MPL, the GPL or the LGPL.
-
- ***** END LICENSE BLOCK ***** -->
<!DOCTYPE dialog [
<!ENTITY % customizeToolbarDTD SYSTEM "chrome://global/locale/customizeToolbar.dtd">
%customizeToolbarDTD;
<!ENTITY % lightningDTD SYSTEM "chrome://lightning/locale/lightning.dtd">
%lightningDTD;
]>
<?xml-stylesheet href="chrome://lightning/skin/lightning.css" type="text/css"?>
<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/x-javascript"
src="chrome://lightning/content/customize-toolbar.js"/>
<vbox id="main-box" flex="1" collapsed="true">
<box orient="vertical" insertbefore="instructions">
<box align="center" orient="horizontal">
<label value="&customize.toolbar.selector.label;"/>
<menulist id="selector-list"
value="mode"
oncommand="updateToolbarSelection(this.value);">
<menupopup>
<menuitem value="mode" label="&customize.toolbar.selector.mode;"/>
<menuitem value="mail" label="&customize.toolbar.selector.mail;"/>
<menuitem value="calendar" label="&customize.toolbar.selector.calendar;"/>
</menupopup>
</menulist>
</box>
<separator class="groove"/>
</box>
<box id="control-box" align="center" insertafter="palette-box">
<label value="&customize.toolbar.location.label;"
location-option="true"
collapsed="true"/>
<menulist id="loction-list"
value="top"
location-option="true"
collapsed="true"
oncommand="updateToolbarLocation(this.value);">
<menupopup>
<menuitem value="top" label="&customize.toolbar.location.top;"/>
<menuitem value="bottom" label="&customize.toolbar.location.bottom;"/>
</menupopup>
</menulist>
<label value="&show.label;"/>
<menulist id="modelist" value="icons" oncommand="updateToolbarMode(this.value);">
<menupopup>
<menuitem value="full" label="&iconsAndText.label;"/>
<menuitem value="icons" label="&icons.label;"/>
<menuitem value="text" label="&text.label;"/>
</menupopup>
</menulist>
<checkbox id="smallicons" oncommand="updateIconSize(this.checked);" label="&useSmallIcons.label;"/>
<spacer flex="1"/>
<button label="&restoreDefaultSet.label;" oncommand="restoreDefaultSet();"/>
</box>
</vbox>
</overlay>

View File

@@ -67,8 +67,8 @@
&lightning.imipbar.description;
</description>
<spacer flex="1"/>
<button id="imip-button1" align="center" pack="end" hidden="true"/>
<button id="imip-button2" align="center" pack="end" hidden="true"/>
<button id="imip-button1" hidden="true"/>
<button id="imip-button2" hidden="true"/>
</hbox>
</hbox>
</vbox>

View File

@@ -166,7 +166,7 @@ function setupBar(imipMethod)
// Bug 348666: here is where we would check if this event was already
// added to calendar or not and display correct information
if (imipMethod == "REQUEST") {
if (imipMethod.toUpperCase() == "REQUEST") {
if (description.firstChild.data) {
description.firstChild.data = ltnGetString("lightning",
"imipBarRequestText");
@@ -186,7 +186,7 @@ function setupBar(imipMethod)
"imipDeclineInvitation.label"));
button.setAttribute("oncommand",
"setAttendeeResponse('DECLINED', 'CONFIRMED');");
} else if (imipMethod == "REPLY") {
} else if (imipMethod.toUpperCase() == "REPLY") {
// Bug xxxx we currently cannot process REPLY messages so just let
// the user know what this is, and don't give them any options.
if (description.firstChild.data) {

View File

@@ -86,9 +86,7 @@
<vbox id="calPreferencesBoxCategories"/>
</tabpanel>
<tabpanel orient="vertical">
<vbox id="calPreferencesBoxViews">
<groupbox id="viewsMultiweekGroupbox" hidden="true"/>
</vbox>
<vbox id="calPreferencesBoxViews"/>
</tabpanel>
<tabpanel orient="vertical">
<vbox id="calPreferencesBoxTimezones"/>

View File

@@ -43,6 +43,8 @@
*
* ***** END LICENSE BLOCK ***** */
var gLastShownCalendarView = null;
var CalendarController =
{
defaultController: null,
@@ -56,6 +58,9 @@ var CalendarController =
case "cmd_redo":
case "cmd_print":
case "cmd_printpreview":
case "button_print":
case "button_delete":
case "cmd_delete":
return true;
}
if (this.defaultController) {
@@ -87,6 +92,7 @@ var CalendarController =
}
}
break;
case "button_print":
case "cmd_print":
if (this.isCalendarInForeground()) {
return true;
@@ -97,6 +103,13 @@ var CalendarController =
return false;
}
break;
case "button_delete":
case "cmd_delete":
if (this.isCalendarInForeground()) {
var selectedItems = currentView().getSelectedItems({});
return selectedItems.length != 0;
}
break;
}
if (this.defaultController) {
return this.defaultController.isCommandEnabled(command);
@@ -133,6 +146,7 @@ var CalendarController =
getTransactionMgr().redo();
}
break;
case "button_print":
case "cmd_print":
if (this.isCalendarInForeground()) {
calPrint();
@@ -144,6 +158,12 @@ var CalendarController =
return;
}
break;
case "button_delete":
case "cmd_delete":
if (this.isCalendarInForeground()) {
return;
}
break;
}
if (this.defaultController) {
this.defaultController.doCommand(command);
@@ -161,7 +181,15 @@ var CalendarController =
function ltnSidebarCalendarSelected(tree)
{
getCompositeCalendar().defaultCalendar = ltnSelectedCalendar();
var selectedCalendar = ltnSelectedCalendar();
if (!selectedCalendar) {
return;
}
var compositeCalendar = getCompositeCalendar();
if (!compositeCalendar.getCalendar(selectedCalendar.uri)) {
compositeCalendar.addCalendar(selectedCalendar);
}
compositeCalendar.defaultCalendar = selectedCalendar;
}
function ltnSelectedCalendar()
@@ -265,6 +293,105 @@ function ltnGoToDate()
function ltnOnLoad(event)
{
// take the existing folderPaneBox (that's what thunderbird displays
// at the left side of the application window) and stuff that inside
// of the deck we're introducing with the contentPanel. this essentially
// rearranges the DOM tree and allows us to switch between content that
// lives inside of the left pane.
var folderPaneBox = document.getElementById("folderPaneBox");
var contentPanel = document.getElementById("contentPanel");
contentPanel.insertBefore(folderPaneBox, contentPanel.firstChild);
// we're taking care of the mode toolbar (that's the small toolbar on
// the lower left with the 'mail', 'calendar', 'task' buttons on it).
// since we want to have this particular toolbar displayed at the
// top or bottom inside the folderPaneBox (basically on top or bottom
// of the window) we need to go to great length in order to get this
// damned thing working. i decided to dynamically place the toolbox
// inside the DOM tree, that appears to be the most clean solution to
// the problem. unfortunately, it didn't work out that easy. as soon
// as we call insertBefore() to place the node somewhere different, the
// constructor of the appropriate binding gets called again. this has
// the nasty side-effect that the toolbar get a bit confused, since it
// thinks it is customized, which just isn't the case. that's why we need
// to carry some internal toolbar properties over. and that's what those
// functions retrieveToolbarProperties() and restoreToolbarProperties()
// are all about.
var retrieveToolbarProperties = function(toolbox)
{
var toolbars = {};
var toolbar = toolbox.firstChild;
while (toolbar) {
if (toolbar.localName == "toolbar") {
if (toolbar.getAttribute("customizable") == "true") {
if (!toolbar.hasAttribute("customindex")) {
var propertybag = {};
propertybag.firstPermanentChild = toolbar.firstPermanentChild;
propertybag.lastPermanentChild = toolbar.lastPermanentChild;
toolbars[toolbar.id] = propertybag;
}
}
}
toolbar = toolbar.nextSibling;
}
return toolbars;
}
var restoreToolbarProperties = function(toolbox,toolbars)
{
var toolbar = toolbox.firstChild;
while (toolbar) {
if (toolbar.localName == "toolbar") {
if (toolbar.getAttribute("customizable") == "true") {
if (!toolbar.hasAttribute("customindex")) {
var propertybag = toolbars[toolbar.id];
toolbar.firstPermanentChild = propertybag.firstPermanentChild;
toolbar.lastPermanentChild = propertybag.lastPermanentChild;
}
}
}
toolbar = toolbar.nextSibling;
}
}
// DOMAttrModified handler that listens on the toolbox element
var onModified = function(aEvent)
{
if(aEvent.attrName == "location") {
var contentPanel = document.getElementById("contentPanel");
var modeToolbox = document.getElementById("mode-toolbox");
var palette = modeToolbox.palette;
modeToolbox.removeEventListener("DOMAttrModified", onModified, false);
var bag = retrieveToolbarProperties(modeToolbox);
if(aEvent.newValue == "top" && aEvent.prevValue == "bottom") {
// place the mode toolbox at the top of the left pane
modeToolbox = contentPanel.parentNode.insertBefore(modeToolbox, contentPanel);
modeToolbox.palette = palette;
var toolbar = document.getElementById("mode-toolbar");
} else if(aEvent.newValue == "bottom" && aEvent.prevValue == "top") {
// place the mode toolbox at the bottom of the left pane
modeToolbox = contentPanel.parentNode.appendChild(modeToolbox);
modeToolbox.palette = palette;
}
restoreToolbarProperties(modeToolbox,bag);
modeToolbox.addEventListener("DOMAttrModified", onModified, false);
}
}
// install the handler that listens for modified 'location' attribute
// on the toolbox. the value is changed by the toolbar customize dialog.
var modeToolbox = document.getElementById("mode-toolbox");
if(modeToolbox.getAttribute("location") != "bottom") {
var palette = modeToolbox.palette;
var bag = retrieveToolbarProperties(modeToolbox);
modeToolbox = contentPanel.parentNode.insertBefore(modeToolbox, contentPanel);
modeToolbox.palette = palette;
restoreToolbarProperties(modeToolbox,bag);
}
modeToolbox.addEventListener("DOMAttrModified", onModified, false);
ltnInitializeMode();
gMiniMonthLoading = true;
var today = new Date();
@@ -330,6 +457,22 @@ function ltnOnLoad(event)
}
}
injectCommandController();
getViewDeck().addEventListener("itemselect", onSelectionChanged, true);
}
function onSelectionChanged(aEvent) {
var elements = document.getElementsByAttribute("disabledwhennoeventsselected", "true");
var selectedItems = aEvent.detail;
for (var i = 0; i < elements.length; i++) {
if (selectedItems.length >= 1) {
elements[i].removeAttribute("disabled");
} else {
elements[i].setAttribute("disabled", "true");
}
}
document.commandDispatcher.updateCommands('mail-toolbar');
document.commandDispatcher.updateCommands('calendar_commands');
}
/* Called at midnight to tell us to redraw date-specific widgets. Do NOT call
@@ -351,6 +494,8 @@ function refreshUIBits() {
function showCalendarView(type)
{
gLastShownCalendarView = type;
// If we got this call while a mail-view is being shown, we need to
// hide all of the mail stuff so we have room to display the calendar
var calendarViewBox = document.getElementById("calendar-view-box");
@@ -362,17 +507,6 @@ function showCalendarView(type)
collapseElement(searchBox);
}
uncollapseElement(calendarViewBox);
// Thunderbird is smart. It won't reload the message list if the user
// clicks the same folder that's already selected. Therefore, we need
// to not only remove the tree selection (so clicking triggers an event)
// but also reset some of TB's internal variables.
var treeSel = document.getElementById("folderTree").view.selection;
treeSel.selectEventsSuppressed = true;
treeSel.clearSelection();
treeSel.selectEventsSuppressed = false;
gMsgFolderSelected = null;
msgWindow.openFolder = null;
}
var view = document.getElementById(type+"-view");
@@ -383,6 +517,7 @@ function showCalendarView(type)
var tasksMenu = document.getElementById("ltn-tasks-in-view")
view.tasksInView = (tasksMenu.getAttribute("checked") == 'true');
view.showCompleted = document.getElementById("completed-tasks-checkbox").checked;
}
document.getElementById("displayDeck").selectedPanel = calendarViewBox;
@@ -393,6 +528,18 @@ function showCalendarView(type)
nextCommand.setAttribute("label", nextCommand.getAttribute("label-"+type));
var previousCommand = document.getElementById("context_previous")
previousCommand.setAttribute("label", previousCommand.getAttribute("label-"+type));
// Set up the commands
var availableViews = document.getElementById("calendar-view-box");
for (var i = 0; i < availableViews.childNodes.length; i++) {
var view = availableViews.childNodes[i];
var command = document.getElementById(view.id+"-command");
if (view.id == type+"-view") {
command.setAttribute("checked", true);
} else {
command.removeAttribute("checked");
}
}
}
function goToToday()

View File

@@ -20,13 +20,15 @@
- the Initial Developer. All Rights Reserved.
-
- Contributor(s):
- Mike Shaver <shaver@mozilla.org>
- Stuart Parmenter <stuart.parmenter@oracle.com>
- Mike Shaver <shaver@mozilla.org>
- Stuart Parmenter <stuart.parmenter@oracle.com>
- Vladimir Vukicevic <vladimir@pobox.com>
- Joey Minta <jminta@gmail.com>
- Simon Paquet <bugzilla@babylonsounds.com>
- Stefan Sitter <ssitter@googlemail.com>
-
- Joey Minta <jminta@gmail.com>
- Simon Paquet <bugzilla@babylonsounds.com>
- Stefan Sitter <ssitter@googlemail.com>
- Philipp Kewisch <mozilla@kewis.ch>
- Michael Buettner <michael.buettner@sun.com>
- Alternatively, the contents of this file may be used under the terms of
- either the GNU General Public License Version 2 or later (the "GPL"), or
- the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
@@ -46,6 +48,7 @@
<!ENTITY % dtd1 SYSTEM "chrome://lightning/locale/lightning.dtd" > %dtd1;
<!ENTITY % dtd2 SYSTEM "chrome://calendar/locale/menuOverlay.dtd" > %dtd2;
<!ENTITY % dtd3 SYSTEM "chrome://calendar/locale/calendar.dtd" > %dtd3;
<!ENTITY % messengerDTD SYSTEM "chrome://messenger/locale/messenger.dtd"> %messengerDTD;
]>
<?xml-stylesheet href="chrome://lightning/skin/lightning.css" type="text/css"?>
@@ -59,6 +62,10 @@
<overlay id="ltnSidebarOverlay"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<stringbundleset id="stringbundleset">
<stringbundle id="bundle_calendar" src="chrome://calendar/locale/calendar.properties"/>
</stringbundleset>
<script type="application/x-javascript" src="chrome://calendar/content/calUtils.js"/>
<script type="application/x-javascript" src="chrome://calendar/content/calendarCreation.js"/>
<script type="application/x-javascript" src="chrome://calendar/content/mouseoverPreviews.js"/>
@@ -69,15 +76,113 @@
<script type="application/x-javascript" src="chrome://lightning/content/calendar-management.js"/>
<script type="application/x-javascript" src="chrome://lightning/content/messenger-overlay-sidebar.js"/>
<script type="application/x-javascript" src="chrome://calendar/content/calendar-views.js"/>
<script type="application/x-javascript" src="chrome://calendar/content/calendar-minimonth-busy.js"/>
<script type="application/x-javascript" src="chrome://calendar/content/clipboard.js"/>
<script type="application/x-javascript" src="chrome://lightning/content/messenger-overlay-toolbar.js"/>
<menupopup id="menu_NewPopup">
<menuseparator />
<menuitem id="ltnNewEvent" label="&lightning.menupopup.new.event.label;"
oncommand="createEventWithDialog(ltnSelectedCalendar());"/>
<menuitem id="ltnNewTask" label="&lightning.menupopup.new.task.label;"
oncommand="createTodoWithDialog(ltnSelectedCalendar());"/>
<menuitem id="ltnNewCalendar" label="&lightning.menupopup.new.calendar.label;"
oncommand="ltnNewCalendar();"/>
</menupopup>
<menubar id="mail-menubar">
<menu id="ltnCalendarMenu" label="&lightning.calendar.label;"
accesskey="&lightning.calendar.accesskey;"
insertbefore="tasksMenu">
<menupopup id="ltncalendarMenuPopup">
<menuitem id="ltnEditSelectedCalendar"
label="&lightning.toolbar.edit.calendar.label;"
accesskey="&lightning.toolbar.edit.calendar.accesskey;"
oncommand="ltnEditSelectedCalendar();"/>
<menuitem id="ltnDeleteSelectedCalendar"
label="&lightning.toolbar.delete.calendar.label;"
accesskey="&lightning.toolbar.delete.calendar.accesskey;"
oncommand="ltnDeleteSelectedCalendar();"/>
<menuseparator/>
<menuitem id="ltnChangeViewDay"
label="&lightning.toolbar.day.label;"
accesskey="&lightning.toolbar.day.accesskey;"
type="radio"
name="calendarMenuViews"
observes="day-view-command"/>
<menuitem id="ltnChangeViewWeek"
label="&lightning.toolbar.week.label;"
accesskey="&lightning.toolbar.week.accesskey;"
type="radio"
name="calendarMenuViews"
observes="week-view-command"/>
<menuitem id="ltnChangeViewMultiweek"
label="&lightning.toolbar.multiweek.label;"
accesskey="&lightning.toolbar.multiweek.accesskey;"
type="radio"
name="calendarMenuViews"
observes="multiweek-view-command"/>
<menuitem id="ltnChangeViewMonth"
label="&lightning.toolbar.month.label;"
accesskey="&lightning.toolbar.month.accesskey;"
type="radio"
name="calendarMenuViews"
observes="month-view-command"/>
<menuseparator/>
<menu label="&viewMenu.label;" accesskey="&viewMenu.accesskey;">
<menupopup>
<menuitem type="checkbox"
id="ltn-workdays-only"
persist="checked"
label="&calendar.onlyworkday.checkbox.label;"
accesskey="&calendar.onlyworkday.checkbox.accesskey;"
oncommand="toggleWorkdaysOnly()"/>
<menuitem type="checkbox"
id="ltn-tasks-in-view"
persist="checked"
label="&calendar.displaytodos.checkbox.label;"
accesskey="&calendar.displaytodos.checkbox.accesskey;"
oncommand="toggleTasksInView()"/>
</menupopup>
</menu>
<menuitem id="ltnGoToToday"
label="&calendar.context.gototoday.label;"
accesskey="&calendar.context.gototoday.accesskey;"
oncommand="goToToday()"/>
<menuseparator/>
<menuitem id="calendar-import-menu"
label="&calendar.import.calendar;"
accesskey="&calendar.import.accesskey;"
observes="import_command"/>
<menuitem id="calendar-export-menu"
label="&calendar.export.calendar;"
accesskey="&calendar.export.calendar.accesskey;"
observes="export_command"/>
</menupopup>
</menu>
</menubar>
<window id="messengerWindow">
<commandset id="calendar_commands">
<command id="publish_calendar" oncommand="ltnPublishCalendar()"/>
<command id="modify_command" oncommand="modifyEventWithDialog(currentView().getSelectedItems({})[0])" disabled="true" disabledwhennoeventsselected="true"/>
<command id="publish_calendar" oncommand="ltnPublishCalendar()" disabled="true" disabledwhennoeventsselected="true"/>
<command id="import_command" oncommand="loadEventsFromFile()"/>
<command id="export_command" oncommand="exportEntireCalendar()"/>
<command id="export_command" oncommand="exportEntireCalendar()" disabled="true" disabledwhennoeventsselected="true"/>
<command id="reload_remote_calendars" oncommand="getCompositeCalendar().refresh();"/>
<command id="switch2mail" oncommand="ltnSwitch2Mail()"/>
<command id="switch2calendar" oncommand="ltnSwitch2Calendar()"/>
<command id="switch2task" oncommand="ltnSwitch2Task()"/>
<command id="day-view-command" oncommand="showCalendarView('day')"/>
<command id="week-view-command" oncommand="showCalendarView('week')"/>
<command id="multiweek-view-command" oncommand="showCalendarView('multiweek')"/>
<command id="month-view-command" oncommand="showCalendarView('month')"/>
</commandset>
<keyset>
<key id="openLightningKey" key="3" modifiers="accel"
oncommand="ltnMinimonthPick(document.getElementById('ltnMinimonth'))"/>
</keyset>
<popupset>
<!-- Popup for Calendars tab -->
<popup id="calendartree-context-menu" onpopupshowing="return true;">
@@ -137,73 +242,108 @@
<tooltip id="itemTooltip" noautohide="true"/>
</window>
<hbox id="mailContent" flex="1">
<vbox id="folderPaneBox" persist="collapsed width height">
<splitter id="folderpaneCalendarSplitter" collapse="after" persist="state"/>
<!-- this will replace 'folderPaneBox' -->
<vbox id="ltnModeBox" insertbefore="folderPaneBox" persist="collapsed width">
<vbox id="ltnSidebar" height="350" persist="height">
<hbox id="ltnMinimonthBox">
<spacer flex="1"/>
<minimonth id="ltnMinimonth" onchange="ltnMinimonthPick(this);" flex="2"/>
<spacer flex="1"/>
</hbox>
<hbox id="ltnDateTextPickerBox">
<spacer flex="1"/>
<datepicker id="ltnDateTextPicker" onchange="ltnMinimonthPick(this)"/>
<spacer flex="1"/>
</hbox>
<deck id="contentPanel" flex="1" minwidth="100" width="200" persist="collapsed width">
<tabbox id="ltnTabpanelBox" flex="1">
<tabs>
<tab label="&lightning.sidebar.agenda.label;"/>
<tab label="&lightning.sidebar.todo.label;"/>
<tab label="&lightning.sidebar.calendars.label;"/>
</tabs>
<tabpanels flex="1">
<vbox id="agenda-tab-panel"/>
<vbox id="todo-tab-panel"/>
<vbox id="calendar-tab-panel" flex="1">
<hbox id="ltnCalendarButtonsBox">
<button id="cal-sidebar-new-calendar" label="&lightning.sidebar.new.label;"
oncommand="ltnNewCalendar();"/>
<button id="cal-sidebar-edit-calendar" label="&lightning.sidebar.edit.label;"
oncommand="ltnEditSelectedCalendar();"/>
<spacer orient="horizontal" flex="5"/>
<button id="cal-sidebar-delete-calendar" label="&lightning.sidebar.delete.label;"
oncommand="ltnDeleteSelectedCalendar();"/>
</hbox>
<tree id="calendarTree" hidecolumnpicker="true" seltype="single"
onfocus="selectedCalendarPane(event)" flex="1"
onselect="ltnSidebarCalendarSelected(this);"
ondblclick="ltnCalendarTreeView.onDoubleClick(event);"
context="calendartree-context-menu">
<treecols>
<treecol id="col-calendar-Checkbox" cycler="true" fixed="true" width="18" >
<image />
</treecol>
<treecol id="col-calendar-Color" fixed="true" width="18"/>
<treecol id="col-calendar-Calendar" label="&lightning.calendar.label;" flex="1"/>
</treecols>
<treechildren>
</treechildren>
</tree>
</vbox>
</tabpanels>
</tabbox>
<vbox id="ltnSidebar" height="350" persist="height">
<hbox id="ltnMinimonthBox">
<spacer flex="1"/>
<minimonth id="ltnMinimonth" onchange="ltnMinimonthPick(this);" flex="2"/>
<spacer flex="1"/>
</hbox>
<hbox id="ltnDateTextPickerBox">
<spacer flex="1"/>
<datepicker id="ltnDateTextPicker" onchange="ltnMinimonthPick(this)"/>
<spacer flex="1"/>
</hbox>
<tabbox id="ltnTabpanelBox" flex="1">
<tabs id="ltnTabpanelTabs">
<tab id="agenda-tab" label="&lightning.sidebar.agenda.label;"/>
<tab id="todo-tab" label="&lightning.sidebar.todo.label;"/>
<tab id="calendar-tab" label="&lightning.sidebar.calendars.label;"/>
</tabs>
<tabpanels id="ltnTabpanels" flex="1">
<vbox id="agenda-tab-panel"/>
<vbox id="todo-tab-panel"/>
<vbox id="calendar-tab-panel" flex="1">
<tree id="calendarTree" hidecolumnpicker="true" seltype="single"
onfocus="selectedCalendarPane(event)" flex="1"
onselect="ltnSidebarCalendarSelected(this);"
ondblclick="ltnCalendarTreeView.onDoubleClick(event);"
context="calendartree-context-menu">
<treecols>
<treecol id="col-calendar-Checkbox" cycler="true" fixed="true" width="18" >
<image />
</treecol>
<treecol id="col-calendar-Color" fixed="true" width="18"/>
<treecol id="col-calendar-Calendar" label="&lightning.calendar.label;" flex="1"/>
</treecols>
<treechildren>
</treechildren>
</tree>
</vbox>
</tabpanels>
</tabbox>
</vbox>
</deck>
<popup id="mode-toolbar-context-menu">
<menuitem id="customize-mode-toolbar"
label="&customizeToolbar.label;"
accesskey="&customizeToolbar.accesskey;"
oncommand="CustomizeApplicationToolbar('mode-toolbox');"/>
</popup>
<toolbox id="mode-toolbox" location="bottom">
<toolbarpalette id="mode-toolbox-palette">
<toolbarbutton class="toolbarbutton-2"
mode="mode"
id="mail-switch-button"
label="&lightning.toolbar.mail.label;"
command="switch2mail"/>
<toolbarbutton class="toolbarbutton-2"
mode="mode"
id="calendar-switch-button"
label="&lightning.toolbar.calendar.label;"
command="switch2calendar"/>
<toolbarbutton class="toolbarbutton-2"
mode="mode"
id="task-switch-button"
label="&lightning.toolbar.task.label;"
command="switch2task"/>
</toolbarpalette>
<toolbar id="mode-toolbar"
class="chromeclass-toolbar"
customizable="true"
defaultset="mail-switch-button,calendar-switch-button,spring"
context="mode-toolbar-context-menu"/>
<toolbarset id="custom-toolbars"/>
</toolbox>
</vbox>
</vbox>
</hbox>
<deck id="displayDeck">
<deck flex="1" id="calendar-view-box">
<calendar-decorated-day-view id="day-view" flex="1"
context="calendar-view-context-menu"
item-context="calendar-item-context-menu"/>
context="calendar-view-context-menu"
item-context="calendar-item-context-menu"/>
<calendar-decorated-week-view id="week-view" flex="1"
context="calendar-view-context-menu"
item-context="calendar-item-context-menu"/>
context="calendar-view-context-menu"
item-context="calendar-item-context-menu"/>
<calendar-decorated-multiweek-view id="multiweek-view" flex="1"
context="calendar-view-context-menu"
item-context="calendar-item-context-menu"/>
<calendar-decorated-month-view id="month-view" flex="1"
context="calendar-view-context-menu"
item-context="calendar-item-context-menu"/>
context="calendar-view-context-menu"
item-context="calendar-item-context-menu"/>
</deck>
</deck>

View File

@@ -0,0 +1,381 @@
/* -*- Mode: javascript; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Sun Microsystems code.
*
* The Initial Developer of the Original Code is Sun Microsystems.
* Portions created by the Initial Developer are Copyright (C) 2007
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Michael Buettner <michael.buettner@sun.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
/**
* Global variables
*/
var gCustomizeId;
/**
* the current mode is set to a string defining the current
* mode we're in. allowed values are:
* - 'mode'
* - 'mail'
* - 'calendar'
* - 'task'
*/
var gCurrentMode;
/**
* ltnInitializeMode() is called from messenger-overlay-sidebar.js during
* handling of the load event. the purpose of this function is to provide
* a dedicated location for the initialization of the mode toolbar stuff.
*/
function ltnInitializeMode()
{
gCurrentMode = 'mail';
// per default we check the mail command.
// we don't need to do anything else since the
// mail view is also shown by default.
var command = document.getElementById("switch2mail");
command.setAttribute("checked", "true");
var printbutton = document.getElementById("button-print");
printbutton.setAttribute("mode", "calendar");
var deletebutton = document.getElementById("button-delete");
deletebutton.setAttribute("mode", "calendar");
}
/**
* this function returns the mode the application is currently in
*/
function ltnCurrentMode()
{
if (!gCurrentMode) {
ltnInitializeMode();
}
return gCurrentMode;
}
/**
* Helper function to get the view deck in a neutral way, regardless of whether
* we're in Tunderbird 1.x or 2.x
*/
function getMailBar() {
return document.getElementById("mail-bar2") ||
document.getElementById("mail-bar");
}
/**
* ltnSwitch2Mail() switches to the mail mode
*/
function ltnSwitch2Mail()
{
if (ltnCurrentMode() != 'mail') {
var switch2mail = document.getElementById("switch2mail");
var switch2calendar = document.getElementById("switch2calendar");
switch2mail.setAttribute("checked", "true");
switch2calendar.removeAttribute("checked");
var mailToolbar = getMailBar();
var calendarToolbar = document.getElementById("calendar-toolbar");
mailToolbar.removeAttribute("collapsed");
calendarToolbar.setAttribute("collapsed", "true");
// the content panel should display the folder tree
var contentDeck = document.getElementById("contentPanel");
contentDeck.selectedPanel = document.getElementById("folderPaneBox");
// tell thunderbird that it needs to refresh the mail list.
// basically, we fake a selection change by directly calling
// the appropriate handler while clearing out some internal
// variables in order to force a refresh of the mail views.
gMsgFolderSelected = null;
msgWindow.openFolder = null;
ShowThreadPane();
FolderPaneSelectionChange();
document.commandDispatcher.updateCommands('mail-toolbar');
document.commandDispatcher.updateCommands('calendar_commands');
gCurrentMode = 'mail';
}
}
/**
* ltnSwitch2Calendar() switches to the calendar mode
*/
function ltnSwitch2Calendar()
{
if (ltnCurrentMode() != 'calendar') {
var switch2mail = document.getElementById("switch2mail");
var switch2calendar = document.getElementById("switch2calendar");
switch2calendar.setAttribute("checked", "true");
switch2mail.removeAttribute("checked");
var mailToolbar = getMailBar();
var calendarToolbar = document.getElementById("calendar-toolbar");
mailToolbar.setAttribute("collapsed", "true");
calendarToolbar.removeAttribute("collapsed");
// the content deck should display the calendar panel
var contentDeck = document.getElementById("contentPanel");
contentDeck.selectedPanel = document.getElementById("ltnSidebar");
// display the calendar panel on the display deck
var deck = document.getElementById("displayDeck");
deck.selectedPanel = document.getElementById("calendar-view-box");
// show the last displayed type of calendar view
if(gLastShownCalendarView == null)
gLastShownCalendarView = 'week';
showCalendarView(gLastShownCalendarView);
document.commandDispatcher.updateCommands('mail-toolbar');
document.commandDispatcher.updateCommands('calendar_commands');
gCurrentMode = 'calendar';
}
}
/**
* ltnSwitch2Task() switches to the task mode
*/
function ltnSwitch2Task()
{
if (ltnCurrentMode() != 'task') {
document.commandDispatcher.updateCommands('mail-toolbar');
document.commandDispatcher.updateCommands('calendar_commands');
gCurrentMode = 'task';
}
}
/**
* CustomizeApplicationToolbar() is called to customize one of the toolbars.
* the appropriate identifier is passed as argument to the function.
*/
// this shadows CustomizeMailToolbar from mail/base/content/mailCore.js
// but adds the specific bits and pieces for lightning.
function CustomizeApplicationToolbar(id)
{
debugger;
// the following code operates different whether
// or not we're actually customizing the mode toolbar or
// any other toolbar.
gCustomizeId = id;
var isModeToolbox = (id == 'mode-toolbox');
var modeName = isModeToolbox ? 'mode' : ltnCurrentMode();
// retrieve the toolbars from the tree
var mailbar = getMailBar();
var menubar = document.getElementById('mail-menubar');
var calendarbar = document.getElementById('calendar-toolbar');
var mailbox = document.getElementById("mail-toolbox");
var modebar = document.getElementById('mode-toolbar');
var modebox = document.getElementById('mode-toolbox');
// install the callback that handles what needs to be
// done after a toolbar has been customized.
mailbox.customizeDone = ModeToolboxCustomizeDone;
modebox.customizeDone = ModeToolboxCustomizeDone;
// disable elements on the toolbars
if (isModeToolbox) {
EnableDisableHierarchy(menubar,true);
EnableDisableHierarchy(mailbar,true);
EnableDisableHierarchy(calendarbar,true);
} else {
EnableDisableHierarchy(modebar,true);
}
var customizePopup = document.getElementById("CustomizeMailToolbar");
customizePopup.setAttribute("disabled", "true");
var wintype = document.documentElement.getAttribute("windowtype");
wintype = wintype.replace(/:/g, "");
// lightning install a new dropdown list in the customize dialog
// which allows to switch to all available toolbars while still
// being in the dialog. in case a new entry has been selected this
// function will be called. the argument will "mode", "mail",
// "calendar" or "task".
var onModeSwitch = function switchHandler(aMode) {
// assume that we're switching to the mode toolbar
var toolbox = 'mode-toolbox';
// check which toolbar is to be customized next
// and possibly switch the the appropriate mode.
if(aMode == 'mail') {
ltnSwitch2Mail();
toolbox = 'mail-toolbox';
} else if(aMode == 'calendar') {
ltnSwitch2Calendar();
toolbox = 'mail-toolbox';
}
// enable/disable all toolbar to reflect the new state
var isMode = (aMode == 'mode');
EnableDisableHierarchy(modebar,!isMode);
EnableDisableHierarchy(menubar,isMode);
EnableDisableHierarchy(mailbar,isMode);
EnableDisableHierarchy(calendarbar,isMode);
// remember the current toolbox
gCustomizeId = toolbox;
// return this appropriate toolbox element
return document.getElementById(toolbox);
};
// open the customize toolbar dialog now...
window.openDialog("chrome://global/content/customizeToolbar.xul",
"CustomizeToolbar"+wintype,
"chrome,all,dependent",
document.getElementById(id), // toolbar dom node
isModeToolbox, // is mode toolbar yes/no?
onModeSwitch, // callback function
modeName); // name of this mode
}
/**
* ModeToolboxCustomizeDone() is called after the customize toolbar dialog
* has been closed by the user. We need to restore the state of all buttons
* and commands of all customizable toolbars.
*/
function ModeToolboxCustomizeDone(aToolboxChanged)
{
// the following code operates different whether
// or not we're actually customizing the mode toolbar or
// any other toolbar.
var isModeToolbox = (gCustomizeId == 'mode-toolbox');
// enable elements on the toolbars
if (isModeToolbox) {
EnableDisableHierarchy(document.getElementById('mail-menubar'),false);
EnableDisableHierarchy(getMailBar(),false);
EnableDisableHierarchy(document.getElementById('calendar-toolbar'),false);
}
// Unconditionally enable the mode toolbar
EnableHierarchy(document.getElementById('mode-toolbar'));
// Update global UI elements that may have been added or removed
MailToolboxCustomizeDone(aToolboxChanged);
// make sure our toolbar buttons have the correct enabled state restored to them...
document.commandDispatcher.updateCommands('calendar_commands');
}
/**
* EnableDisableHierarchy() recursively walks the dom tree and enables or disables
* all elements it encounters. this function is used by ModeToolboxCustomizeDone()
* and CustomizeApplicationToolbar().
*/
// step along the hierarchy where the top-node is to be passed
// as argument and enable/disable all nodes depending on the given flag.
function EnableDisableHierarchy(item,disable)
{
// iterate all nodes on this particular level
for (var i = 0; i < item.childNodes.length; ++i) {
// retrieve the next node that needs to be processed
var child = item.childNodes[i];
// disable this node if flag indicates this case, enable otherwise
if (disable) {
// in case this node has already been disabled, we remember
// this fact in the 'itemdisabled' attribute in order
// to restore the original state at the end of the operation.
if (child.getAttribute("disabled") == "true") {
child.setAttribute("itemdisabled", "true");
}
child.setAttribute("disabled","true");
} else {
// restore the previous state, which means either enable
// the node or keep it disabled but remove the
// 'itemdisabled' attribute.
if(child.hasAttribute("itemdisabled")) {
child.removeAttribute("itemdisabled");
} else {
child.removeAttribute("disabled");
}
}
// recursively step down the hierarchy if this node
// exposes any further child nodes.
if (child.childNodes.length > 0) {
EnableDisableHierarchy(child,disable);
}
}
}
/**
* EnableHierarchy() recursively walks the dom tree and enables
* all elements it encounters. this function is used by ModeToolboxCustomizeDone().
*/
// step along the hierarchy where the top-node is to be passed
// as argument and enable all nodes unconditionally.
function EnableHierarchy(item)
{
// iterate all nodes on this particular level
for (var i = 0; i < item.childNodes.length; ++i) {
// retrieve the next node that needs to be processed
var child = item.childNodes[i];
// always enable this node and remove the
// 'itemdisabled' attribute.
if (child.hasAttribute("itemdisabled")) {
child.removeAttribute("itemdisabled");
}
child.removeAttribute("disabled");
// recursively step down the hierarchy if this node
// exposes any further child nodes.
if (child.childNodes.length > 0) {
EnableHierarchy(child);
}
}
}

View File

@@ -39,126 +39,129 @@
-
- ***** END LICENSE BLOCK ***** -->
<!DOCTYPE overlay [
<!ENTITY % messengerDTD SYSTEM "chrome://messenger/locale/messenger.dtd">
%messengerDTD;
<!ENTITY % calendarDTD SYSTEM "chrome://calendar/locale/calendar.dtd" >
%calendarDTD;
]>
<?xml-stylesheet href="chrome://calendar/skin/calendar-toolbar.css" type="text/css"?>
<?xml-stylesheet href="chrome://lightning/skin/lightning.css" type="text/css"?>
<!DOCTYPE overlay
[
<!ENTITY % dtd1 SYSTEM "chrome://lightning/locale/lightning.dtd" > %dtd1;
<!ENTITY % dtd2 SYSTEM "chrome://calendar/locale/calendar.dtd" > %dtd2;
<!ENTITY % dtd3 SYSTEM "chrome://calendar/locale/menuOverlay.dtd" > %dtd3;
]>
<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<stringbundleset id="stringbundleset">
<stringbundle id="bundle_calendar" src="chrome://calendar/locale/calendar.properties"/>
</stringbundleset>
<script type="application/x-javascript"
src="chrome://lightning/content/messenger-overlay-toolbar.js"/>
<script type="application/x-javascript"
src="chrome://calendar/content/calendar-item-editing.js"/>
<script type="application/x-javascript"
src="chrome://lightning/content/calendar-management.js"/>
<popup id="toolbar-context-menu">
<menuitem id="CustomizeMailToolbar"
label="&customizeToolbar.label;"
accesskey="&customizeToolbar.accesskey;"
oncommand="CustomizeApplicationToolbar('mail-toolbox');"/>
</popup>
<window id="messengerWindow">
<keyset>
<key id="openLightningKey" key="3" modifiers="accel"
oncommand="ltnMinimonthPick(document.getElementById('ltnMinimonth'))"/>
</keyset>
</window>
<menupopup id="menu_NewPopup">
<menuseparator />
<menuitem id="ltnNewEvent" label="&lightning.menupopup.new.event.label;"
oncommand="createEventWithDialog(ltnSelectedCalendar());"/>
<menuitem id="ltnNewTask" label="&lightning.menupopup.new.task.label;"
oncommand="createTodoWithDialog(ltnSelectedCalendar());"/>
<menuitem id="ltnNewCalendar" label="&lightning.menupopup.new.calendar.label;"
oncommand="ltnNewCalendar();"/>
</menupopup>
<menubar id="mail-menubar">
<menu id="ltnCalendarMenu" label="&lightning.calendar.label;"
accesskey="&lightning.calendar.accesskey;"
insertbefore="tasksMenu">
<menupopup id="ltncalendarMenuPopup">
<menuitem id="ltnChangeViewDay"
label="&lightning.toolbar.dayview.label;"
accesskey="&lightning.toolbar.dayview.accesskey;"
oncommand="showCalendarView('day')"/>
<menuitem id="ltnChangeViewWeek"
label="&lightning.toolbar.weekview.label;"
accesskey="&lightning.toolbar.weekview.accesskey;"
oncommand="showCalendarView('week')"/>
<menuitem id="ltnChangeViewMonth"
label="&lightning.toolbar.monthview.label;"
accesskey="&lightning.toolbar.monthview.accesskey;"
oncommand="showCalendarView('month')"/>
<menuseparator/>
<menu label="&viewMenu.label;" accesskey="&viewMenu.accesskey;">
<menupopup>
<menuitem type="checkbox"
id="ltn-workdays-only"
persist="checked"
label="&calendar.onlyworkday.checkbox.label;"
accesskey="&calendar.onlyworkday.checkbox.accesskey;"
oncommand="toggleWorkdaysOnly()"/>
<menuitem type="checkbox"
id="ltn-tasks-in-view"
persist="checked"
label="&calendar.displaytodos.checkbox.label;"
accesskey="&calendar.displaytodos.checkbox.accesskey;"
oncommand="toggleTasksInView()"/>
</menupopup>
</menu>
<menuitem id="ltnGoToToday"
label="&calendar.context.gototoday.label;"
accesskey="&calendar.context.gototoday.accesskey;"
oncommand="goToToday()"/>
<menuseparator/>
<menuitem id="calendar-import-menu"
label="&calendar.import.calendar;"
accesskey="&calendar.import.accesskey;"
observes="import_command"/>
<menuitem id="calendar-export-menu"
label="&calendar.export.calendar;"
accesskey="&calendar.export.calendar.accesskey;"
observes="export_command"/>
</menupopup>
</menu>
</menubar>
<menuitem id="menu_customizeToolbar"
oncommand="CustomizeApplicationToolbar('mail-toolbox');"
label="&customizeToolbar.label;"
accesskey="&customizeToolbar.accesskey;"/>
<toolbarpalette id="MailToolbarPalette">
<toolbarbutton id="calendar-new-event-button"
class="cal-toolbarbutton-1"
label="&calendar.newevent.button.label;"
tooltiptext="&calendar.newevent.button.tooltip;"
<toolbarbutton id="calendar-new-event-button"
mode="calendar"
class="cal-toolbarbutton-1"
label="&calendar.newevent.button.label;"
tooltiptext="&calendar.newevent.button.tooltip;"
oncommand="createEventWithDialog(ltnSelectedCalendar())"/>
<toolbarbutton id="calendar-new-task-button"
class="cal-toolbarbutton-1"
label="&calendar.newtask.button.label;"
tooltiptext="&calendar.newtask.button.tooltip;"
<toolbarbutton id="calendar-new-task-button"
mode="calendar"
class="cal-toolbarbutton-1"
label="&calendar.newtask.button.label;"
tooltiptext="&calendar.newtask.button.tooltip;"
oncommand="createTodoWithDialog(ltnSelectedCalendar())"/>
<toolbarbutton id="calendar-week-view-button"
class="cal-toolbarbutton-1"
label="&calendar.weekview.button.label;"
tooltiptext="&calendar.weekview.button.tooltip;"
oncommand="showCalendarView('week')"/>
<toolbarbutton id="calendar-month-view-button"
class="cal-toolbarbutton-1"
label="&calendar.monthview.button.label;"
tooltiptext="&calendar.monthview.button.tooltip;"
oncommand="showCalendarView('month')"/>
<toolbarbutton id="calendar-day-view-button"
class="cal-toolbarbutton-1"
label="&calendar.dayview.button.label;"
tooltiptext="&calendar.dayview.button.tooltip;"
oncommand="showCalendarView('day')"/>
<toolbarbutton id="calendar-go-to-today-button"
class="cal-toolbarbutton-1"
label="&calendar.gototoday.button.label;"
tooltiptext="&calendar.gototoday.button.tooltip;"
<toolbarbutton id="calendar-day-view-button"
mode="calendar"
type="radio"
group="calendarViews"
class="cal-toolbarbutton-1"
label="&calendar.day.button.label;"
tooltiptext="&calendar.day.button.tooltip;"
observes="day-view-command"/>
<toolbarbutton id="calendar-week-view-button"
mode="calendar"
type="radio"
group="calendarViews"
class="cal-toolbarbutton-1"
label="&calendar.week.button.label;"
tooltiptext="&calendar.week.button.tooltip;"
observes="week-view-command"/>
<toolbarbutton id="calendar-multiweek-view-button"
mode="calendar"
type="radio"
group="calendarViews"
class="cal-toolbarbutton-1"
label="&calendar.multiweek.button.label;"
tooltiptext="&calendar.multiweek.button.tooltip;"
observes="multiweek-view-command"/>
<toolbarbutton id="calendar-month-view-button"
mode="calendar"
type="radio"
group="calendarViews"
class="cal-toolbarbutton-1"
label="&calendar.month.button.label;"
tooltiptext="&calendar.month.button.tooltip;"
observes="month-view-command"/>
<toolbarbutton id="calendar-go-to-today-button"
mode="calendar"
class="cal-toolbarbutton-1"
label="&calendar.today.button.label;"
tooltiptext="&calendar.today.button.tooltip;"
oncommand="goToToday()"/>
<toolbarbutton id="calendar-edit-event-button"
mode="calendar"
class="cal-toolbarbutton-1"
label="&calendar.edit.button.label;"
tooltiptext="&calendar.edit.button.tooltip;"
observes="modify_command"/>
<toolbarbutton id="calendar-import-button"
mode="calendar"
class="cal-toolbarbutton-1"
label="&calendar.import.button.label;"
tooltiptext="&calendar.import.button.tooltip;"
observes="import_command"/>
<toolbarbutton id="calendar-export-button"
mode="calendar"
class="cal-toolbarbutton-1"
label="&calendar.export.button.label;"
tooltiptext="&calendar.export.button.tooltip;"
observes="export_command"/>
<toolbarbutton id="calendar-subscribe-button"
mode="calendar"
class="cal-toolbarbutton-1"
label="&calendar.subscribe.button.label;"
tooltiptext="&calendar.subscribe.button.tooltip;"
oncommand="openCalendarWizard()"/>
<toolbarbutton id="calendar-publish-button"
mode="calendar"
class="cal-toolbarbutton-1"
label="&calendar.publish.button.label;"
tooltiptext="&calendar.publish.button.tooltip;"
observes="publish_calendar"/>
<toolbarbutton id="calendar-remote-reload-button"
mode="calendar"
class="cal-toolbarbutton-1"
label="&calendar.remotereload.button.label;"
tooltiptext="&calendar.remotereload.button.tooltip;"
observes="reload_remote_calendars"/>
</toolbarpalette>
<toolbox id="mail-toolbox">
<toolbar id="calendar-toolbar"
class="chromeclass-toolbar"
customizable="true"
context="toolbar-context-menu"
collapsed="true"
defaultset="calendar-new-event-button,calendar-new-task-button,separator,calendar-go-to-today-button,separator,calendar-day-view-button,calendar-week-view-button,calendar-multiweek-view-button,calendar-month-view-button,separator,button-delete,button-print,separator,calendar-remote-reload-button,spring"/>
</toolbox>
</overlay>

View File

@@ -78,6 +78,17 @@ function toggleCompletedTasks()
{
document.getElementById("calendar-todo-list").showCompleted =
!document.getElementById("calendar-todo-list").showCompleted;
agendaTreeView.refreshCalendarQuery();
var deck = document.getElementById("calendar-view-box")
for each (view in deck.childNodes) {
view.showCompleted = !view.showCompleted;
}
// Refresh the current view
currentView().goToDay(currentView().selectedDay);
return;
}

View File

@@ -11,6 +11,7 @@ lightning.jar:
content/lightning/messenger-overlay-preferences.xul (content/messenger-overlay-preferences.xul)
content/lightning/messenger-overlay-preferences.js (content/messenger-overlay-preferences.js)
content/lightning/lightning-migration.xul (content/lightning-migration.xul)
content/lightning/messenger-overlay-toolbar.js (content/messenger-overlay-toolbar.js)
content/lightning/messenger-overlay-toolbar.xul (content/messenger-overlay-toolbar.xul)
content/lightning/todo-list-overlay.xul (content/todo-list-overlay.xul)
content/lightning/todo-list.js (content/todo-list.js)
@@ -19,6 +20,8 @@ lightning.jar:
content/lightning/toolkit-overlay-custombar.xul (content/toolkit-overlay-custombar.xul)
content/lightning/imip-bar-overlay.xul (content/imip-bar-overlay.xul)
content/lightning/imip-bar.js (content/imip-bar.js)
content/lightning/customize-toolbar.xul (content/customize-toolbar.xul)
content/lightning/customize-toolbar.js (content/customize-toolbar.js)
content/lightning/sun-messenger-overlay-sidebar.xul (/calendar/prototypes/wcap/sun-messenger-overlay-sidebar.xul)
content/lightning/sun-messenger-overlay-sidebar.js (/calendar/prototypes/wcap/sun-messenger-overlay-sidebar.js)
#expand skin/classic/lightning/imip.css (themes/__THEME__/imip.css)
@@ -31,7 +34,6 @@ lightning-en-US.jar:
locale/en-US/lightning/sun-lightning.dtd (/calendar/locales/en-US/chrome/prototypes/sun-lightning.dtd)
calendar.jar:
* content/calendar/applicationUtil.js (/calendar/resources/content/applicationUtil.js)
content/calendar/calendarProperties.xul (/calendar/resources/content/calendarProperties.xul)
content/calendar/calendarProperties.js (/calendar/resources/content/calendarProperties.js)
content/calendar/calendarCreation.xul (/calendar/resources/content/calendarCreation.xul)

View File

@@ -168,3 +168,131 @@ radio[pane=paneLightning] {
padding: 6px 8px;
color: black;
}
/* ::::: mode toolbar buttons ::::: */
#mode-toolbar {
padding-top: 5px;
padding-bottom: 5px;
}
.toolbarbutton-2 {
-moz-box-orient: vertical;
min-width: 0px;
list-style-image: url("chrome://calendar/skin/mode-switch-icons.png");
}
.toolbarbutton-2[type="menu"] {
-moz-binding: url("chrome://global/content/bindings/toolbarbutton.xml#menu-vertical");
}
#mail-switch-button {
-moz-image-region: rect(0px 38px 38px 0px);
}
#mail-switch-button:hover:active {
-moz-image-region: rect(38px 38px 76px 0px);
}
#mail-switch-button[disabled] {
-moz-image-region: rect(76px 38px 114px 0px);
}
#calendar-switch-button {
-moz-image-region: rect(0px 76px 38px 38px);
}
#calendar-switch-button:hover:active {
-moz-image-region: rect(38px 76px 76px 38px);
}
#calendar-switch-button[disabled] {
-moz-image-region: rect(76px 76px 114px 38px);
}
#task-switch-button {
-moz-image-region: rect(0px 114px 38px 76px);
}
#task-switch-button:hover:active {
-moz-image-region: rect(38px 114px 76px 76px);
}
#task-switch-button[disabled] {
-moz-image-region: rect(76px 114px 114px 76px);
}
/* ::::: small mode toolbar buttons ::::: */
toolbar[iconsize="small"] .toolbarbutton-2 {
list-style-image: url("chrome://calendar/skin/mode-switch-icons.png");
}
toolbar[iconsize="small"] #mail-switch-button {
-moz-image-region: rect(0px 136px 22px 114px);
}
toolbar[iconsize="small"] #mail-switch-button:hover:active {
-moz-image-region: rect(0px 158px 22px 136px);
}
toolbar[iconsize="small"] #mail-switch-button[disabled] {
-moz-image-region: rect(22px 136px 44px 114px);
}
toolbar[iconsize="small"] #calendar-switch-button {
-moz-image-region: rect(22px 158px 44px 136px);
}
toolbar[iconsize="small"] #calendar-switch-button:hover:active {
-moz-image-region: rect(44px 136px 66px 114px);
}
toolbar[iconsize="small"] #calendar-switch-button[disabled] {
-moz-image-region: rect(44px 158px 66px 136px);
}
toolbar[iconsize="small"] #task-switch-button {
-moz-image-region: rect(66px 136px 88px 114px);
}
toolbar[iconsize="small"] #task-switch-button:hover:active {
-moz-image-region: rect(66px 158px 88px 136px);
}
toolbar[iconsize="small"] #task-switch-button[disabled] {
-moz-image-region: rect(88px 136px 110px 114px);
}
/*--------------------------------------------------------------------
* tooltips
*-------------------------------------------------------------------*/
vbox.tooltipBox {
max-width: 40em;
}
column.tooltipValueColumn {
max-width: 35em; /* tooltipBox max-width minus space for label */
}
label.tooltipHeaderLabel {
font-weight: bold;
text-align: right;
margin: 0em 1em 0em 0em; /* 1em space before value */
}
description.tooltipHeaderDescription {
font-weight: normal;
text-align: left;
margin: 0pt;
}
separator.tooltipBodySeparator {
height: 1ex; /* 1ex space above body text, below last header. */
}
description.tooltipBody {
font-weight: normal;
white-space: -moz-pre-wrap;
margin: 0pt;
}

View File

@@ -169,3 +169,131 @@ radio[pane=paneLightning] {
border-bottom: 1px solid ThreeDDarkShadow;
padding: 3px;
}
/* ::::: mode toolbar buttons ::::: */
#mode-toolbar {
padding-top: 5px;
padding-bottom: 5px;
}
.toolbarbutton-2 {
-moz-box-orient: vertical;
min-width: 0px;
list-style-image: url("chrome://calendar/skin/mode-switch-icons.png");
}
.toolbarbutton-2[type="menu"] {
-moz-binding: url("chrome://global/content/bindings/toolbarbutton.xml#menu-vertical");
}
#mail-switch-button {
-moz-image-region: rect(0px 38px 38px 0px);
}
#mail-switch-button:hover:active {
-moz-image-region: rect(38px 38px 76px 0px);
}
#mail-switch-button[disabled] {
-moz-image-region: rect(76px 38px 114px 0px);
}
#calendar-switch-button {
-moz-image-region: rect(0px 76px 38px 38px);
}
#calendar-switch-button:hover:active {
-moz-image-region: rect(38px 76px 76px 38px);
}
#calendar-switch-button[disabled] {
-moz-image-region: rect(76px 76px 114px 38px);
}
#task-switch-button {
-moz-image-region: rect(0px 114px 38px 76px);
}
#task-switch-button:hover:active {
-moz-image-region: rect(38px 114px 76px 76px);
}
#task-switch-button[disabled] {
-moz-image-region: rect(76px 114px 114px 76px);
}
/* ::::: small mode toolbar buttons ::::: */
toolbar[iconsize="small"] .toolbarbutton-2 {
list-style-image: url("chrome://calendar/skin/mode-switch-icons.png");
}
toolbar[iconsize="small"] #mail-switch-button {
-moz-image-region: rect(0px 136px 22px 114px);
}
toolbar[iconsize="small"] #mail-switch-button:hover:active {
-moz-image-region: rect(0px 158px 22px 136px);
}
toolbar[iconsize="small"] #mail-switch-button[disabled] {
-moz-image-region: rect(22px 136px 44px 114px);
}
toolbar[iconsize="small"] #calendar-switch-button {
-moz-image-region: rect(22px 158px 44px 136px);
}
toolbar[iconsize="small"] #calendar-switch-button:hover:active {
-moz-image-region: rect(44px 136px 66px 114px);
}
toolbar[iconsize="small"] #calendar-switch-button[disabled] {
-moz-image-region: rect(44px 158px 66px 136px);
}
toolbar[iconsize="small"] #task-switch-button {
-moz-image-region: rect(66px 136px 88px 114px);
}
toolbar[iconsize="small"] #task-switch-button:hover:active {
-moz-image-region: rect(66px 158px 88px 136px);
}
toolbar[iconsize="small"] #task-switch-button[disabled] {
-moz-image-region: rect(88px 136px 110px 114px);
}
/*--------------------------------------------------------------------
* tooltips
*-------------------------------------------------------------------*/
vbox.tooltipBox {
max-width: 40em;
}
column.tooltipValueColumn {
max-width: 35em; /* tooltipBox max-width minus space for label */
}
label.tooltipHeaderLabel {
font-weight: bold;
text-align: right;
margin: 0em 1em 0em 0em; /* 1em space before value */
}
description.tooltipHeaderDescription {
font-weight: normal;
text-align: left;
margin: 0pt;
}
separator.tooltipBodySeparator {
height: 1ex; /* 1ex space above body text, below last header. */
}
description.tooltipBody {
font-weight: normal;
white-space: -moz-pre-wrap;
margin: 0pt;
}

View File

@@ -9,6 +9,7 @@ ga-IE
hu
it
ja
ka
lt
mk
mn

View File

@@ -72,7 +72,7 @@
<!ENTITY calendar.calendartab.label "Date">
<!ENTITY calendar.listofcalendarstab.label "Calendars">
<!ENTITY calendar.gototoday.button.label "Go to Today" >
<!ENTITY calendar.today.button.label "Today" >
<!ENTITY calendar.events.filter.all.label "All Events">
<!ENTITY calendar.events.filter.today.label "Today's Events">
@@ -97,13 +97,13 @@
<!ENTITY calendar.unifinder.tree.calendarname.label "Calendar Name">
<!ENTITY calendar.find.key "F">
<!ENTITY calendar.gototoday.button.tooltip "Go to today" >
<!ENTITY calendar.today.button.tooltip "Go to today" >
<!ENTITY calendar.choosedate.button.tooltip "Choose date to go to" >
<!ENTITY calendar.dayview.button.tooltip "Switch to day view" >
<!ENTITY calendar.weekview.button.tooltip "Switch to week view" >
<!ENTITY calendar.monthview.button.tooltip "Switch to month view" >
<!ENTITY calendar.multiweekview.button.tooltip "Switch to multiweek view" >
<!ENTITY calendar.day.button.tooltip "Switch to day view" >
<!ENTITY calendar.week.button.tooltip "Switch to week view" >
<!ENTITY calendar.month.button.tooltip "Switch to month view" >
<!ENTITY calendar.multiweek.button.tooltip "Switch to multiweek view" >
<!ENTITY calendar.nextday.button.tooltip "Next Day" >
<!ENTITY calendar.prevday.button.tooltip "Previous Day" >
@@ -147,10 +147,10 @@
<!ENTITY calendar.remotereload.button.label "Reload" >
<!ENTITY calendar.remotereload.button.tooltip "Reload all remote calendars" >
<!ENTITY calendar.dayview.button.label "Day View" >
<!ENTITY calendar.weekview.button.label "Week View" >
<!ENTITY calendar.monthview.button.label "Month View" >
<!ENTITY calendar.multiweekview.button.label "Multiweek" >
<!ENTITY calendar.day.button.label "Day" >
<!ENTITY calendar.week.button.label "Week" >
<!ENTITY calendar.month.button.label "Month" >
<!ENTITY calendar.multiweek.button.label "Multiweek" >
<!ENTITY calendar.onlyworkday.checkbox.label "Workweek days only" >
<!ENTITY calendar.onlyworkday.checkbox.accesskey "r" >
<!ENTITY calendar.displaytodos.checkbox.label "Tasks in View" >

View File

@@ -102,7 +102,9 @@ None=None
## @name UID_NOT_FOUND
## @loc none
tooNewSchemaErrorBoxTitle=Your calendar data isn't compatible with this version of %1$S
tooNewSchemaErrorBoxText=The calendar data in your profile was updated by a newer version of %1$S, and continuing will probably cause the information to be lost or corrupted. %2$S will now quit.
tooNewSchemaErrorBoxTextLightning=The calendar data in your profile was updated by a newer version of %1$S, and continuing will probably cause the information to be lost or corrupted. %1$S will now be disabled and %2$S restarted.
tooNewSchemaErrorBoxTextSunbird=The calendar data in your profile was updated by a newer version of %1$S, and continuing will probably cause the information to be lost or corrupted. %1$S will now quit.
tooNewSchemaButtonRestart=Restart %1$S
tooNewSchemaButtonQuit=Quit %1$S
# Editing repeating items strings

View File

@@ -95,9 +95,20 @@
<!ENTITY pref.timezone.America.Anguilla "America/Anguilla" >
<!ENTITY pref.timezone.America.Antigua "America/Antigua" >
<!ENTITY pref.timezone.America.Araguaina "America/Araguaina" >
<!ENTITY pref.timezone.America.Argentina.Buenos_Aires "America/Argentina/Buenos_Aires" >
<!ENTITY pref.timezone.America.Argentina.Catamarca "America/Argentina/Catamarca" >
<!ENTITY pref.timezone.America.Argentina.Cordoba "America/Argentina/Cordoba" >
<!ENTITY pref.timezone.America.Argentina.Jujuy "America/Argentina/Jujuy" >
<!ENTITY pref.timezone.America.Argentina.La_Rioja "America/Argentina/La_Rioja" >
<!ENTITY pref.timezone.America.Argentina.Mendoza "America/Argentina/Mendoza" >
<!ENTITY pref.timezone.America.Argentina.Rio_Gallegos "America/Argentina/Rio_Gallegos" >
<!ENTITY pref.timezone.America.Argentina.San_Juan "America/Argentina/San_Juan" >
<!ENTITY pref.timezone.America.Argentina.Tucuman "America/Argentina/Tucuman" >
<!ENTITY pref.timezone.America.Argentina.Ushuaia "America/Argentina/Ushuaia" >
<!ENTITY pref.timezone.America.Aruba "America/Aruba" >
<!ENTITY pref.timezone.America.Asuncion "America/Asuncion" >
<!ENTITY pref.timezone.America.Atikokan "America/Atikokan" >
<!ENTITY pref.timezone.America.Bahia "America/Bahia" >
<!ENTITY pref.timezone.America.Barbados "America/Barbados" >
<!ENTITY pref.timezone.America.Belem "America/Belem" >
<!ENTITY pref.timezone.America.Belize "America/Belize" >
@@ -105,19 +116,18 @@
<!ENTITY pref.timezone.America.Boa_Vista "America/Boa_Vista" >
<!ENTITY pref.timezone.America.Bogota "America/Bogota" >
<!ENTITY pref.timezone.America.Boise "America/Boise" >
<!ENTITY pref.timezone.America.Buenos_Aires "America/Buenos_Aires" >
<!ENTITY pref.timezone.America.Cambridge_Bay "America/Cambridge_Bay" >
<!ENTITY pref.timezone.America.Campo_Grande "America/Campo_Grande" >
<!ENTITY pref.timezone.America.Cancun "America/Cancun" >
<!ENTITY pref.timezone.America.Caracas "America/Caracas" >
<!ENTITY pref.timezone.America.Catamarca "America/Catamarca" >
<!ENTITY pref.timezone.America.Cayenne "America/Cayenne" >
<!ENTITY pref.timezone.America.Cayman "America/Cayman" >
<!ENTITY pref.timezone.America.Chicago "America/Chicago" >
<!ENTITY pref.timezone.America.Chihuahua "America/Chihuahua" >
<!ENTITY pref.timezone.America.Cordoba "America/Cordoba" >
<!ENTITY pref.timezone.America.Costa_Rica "America/Costa_Rica" >
<!ENTITY pref.timezone.America.Cuiaba "America/Cuiaba" >
<!ENTITY pref.timezone.America.Curacao "America/Curacao" >
<!ENTITY pref.timezone.America.Danmarkshavn "America/Danmarkshavn" >
<!ENTITY pref.timezone.America.Dawson "America/Dawson" >
<!ENTITY pref.timezone.America.Dawson_Creek "America/Dawson_Creek" >
<!ENTITY pref.timezone.America.Denver "America/Denver" >
@@ -148,7 +158,6 @@
<!ENTITY pref.timezone.America.Inuvik "America/Inuvik" >
<!ENTITY pref.timezone.America.Iqaluit "America/Iqaluit" >
<!ENTITY pref.timezone.America.Jamaica "America/Jamaica" >
<!ENTITY pref.timezone.America.Jujuy "America/Jujuy" >
<!ENTITY pref.timezone.America.Juneau "America/Juneau" >
<!ENTITY pref.timezone.America.Kentucky.Louisville "America/Kentucky/Louisville" >
<!ENTITY pref.timezone.America.Kentucky.Monticello "America/Kentucky/Monticello" >
@@ -160,7 +169,6 @@
<!ENTITY pref.timezone.America.Manaus "America/Manaus" >
<!ENTITY pref.timezone.America.Martinique "America/Martinique" >
<!ENTITY pref.timezone.America.Mazatlan "America/Mazatlan" >
<!ENTITY pref.timezone.America.Mendoza "America/Mendoza" >
<!ENTITY pref.timezone.America.Menominee "America/Menominee" >
<!ENTITY pref.timezone.America.Merida "America/Merida" >
<!ENTITY pref.timezone.America.Mexico_City "America/Mexico_City" >
@@ -175,6 +183,7 @@
<!ENTITY pref.timezone.America.Nipigon "America/Nipigon" >
<!ENTITY pref.timezone.America.Nome "America/Nome" >
<!ENTITY pref.timezone.America.Noronha "America/Noronha" >
<!ENTITY pref.timezone.America.North_Dakota.Center "America/North_Dakota/Center" >
<!ENTITY pref.timezone.America.North_Dakota.New_Salem "America/North_Dakota/New_Salem" >
<!ENTITY pref.timezone.America.Panama "America/Panama" >
<!ENTITY pref.timezone.America.Pangnirtung "America/Pangnirtung" >
@@ -189,7 +198,6 @@
<!ENTITY pref.timezone.America.Recife "America/Recife" >
<!ENTITY pref.timezone.America.Regina "America/Regina" >
<!ENTITY pref.timezone.America.Rio_Branco "America/Rio_Branco" >
<!ENTITY pref.timezone.America.Rosario "America/Rosario" >
<!ENTITY pref.timezone.America.Santiago "America/Santiago" >
<!ENTITY pref.timezone.America.Santo_Domingo "America/Santo_Domingo" >
<!ENTITY pref.timezone.America.Sao_Paulo "America/Sao_Paulo" >
@@ -205,6 +213,7 @@
<!ENTITY pref.timezone.America.Thule "America/Thule" >
<!ENTITY pref.timezone.America.Thunder_Bay "America/Thunder_Bay" >
<!ENTITY pref.timezone.America.Tijuana "America/Tijuana" >
<!ENTITY pref.timezone.America.Toronto "America/Toronto" >
<!ENTITY pref.timezone.America.Tortola "America/Tortola" >
<!ENTITY pref.timezone.America.Vancouver "America/Vancouver" >
<!ENTITY pref.timezone.America.Whitehorse "America/Whitehorse" >
@@ -217,6 +226,7 @@
<!ENTITY pref.timezone.Antarctica.Mawson "Antarctica/Mawson" >
<!ENTITY pref.timezone.Antarctica.McMurdo "Antarctica/McMurdo" >
<!ENTITY pref.timezone.Antarctica.Palmer "Antarctica/Palmer" >
<!ENTITY pref.timezone.Antarctica.Rothera "Antarctica/Rothera" >
<!ENTITY pref.timezone.Antarctica.South_Pole "Antarctica/South_Pole" >
<!ENTITY pref.timezone.Antarctica.Syowa "Antarctica/Syowa" >
<!ENTITY pref.timezone.Antarctica.Vostok "Antarctica/Vostok" >
@@ -236,7 +246,8 @@
<!ENTITY pref.timezone.Asia.Bishkek "Asia/Bishkek" >
<!ENTITY pref.timezone.Asia.Brunei "Asia/Brunei" >
<!ENTITY pref.timezone.Asia.Calcutta "Asia/Calcutta" >
<!ENTITY pref.timezone.Asia.Chungking "Asia/Chungking" >
<!ENTITY pref.timezone.Asia.Choibalsan "Asia/Choibalsan" >
<!ENTITY pref.timezone.Asia.Chongqing "Asia/Chongqing" >
<!ENTITY pref.timezone.Asia.Colombo "Asia/Colombo" >
<!ENTITY pref.timezone.Asia.Damascus "Asia/Damascus" >
<!ENTITY pref.timezone.Asia.Dhaka "Asia/Dhaka" >
@@ -261,20 +272,24 @@
<!ENTITY pref.timezone.Asia.Kuala_Lumpur "Asia/Kuala_Lumpur" >
<!ENTITY pref.timezone.Asia.Kuching "Asia/Kuching" >
<!ENTITY pref.timezone.Asia.Kuwait "Asia/Kuwait" >
<!ENTITY pref.timezone.Asia.Macao "Asia/Macao" >
<!ENTITY pref.timezone.Asia.Macau "Asia/Macau" >
<!ENTITY pref.timezone.Asia.Magadan "Asia/Magadan" >
<!ENTITY pref.timezone.Asia.Makassar "Asia/Makassar" >
<!ENTITY pref.timezone.Asia.Manila "Asia/Manila" >
<!ENTITY pref.timezone.Asia.Muscat "Asia/Muscat" >
<!ENTITY pref.timezone.Asia.Nicosia "Asia/Nicosia" >
<!ENTITY pref.timezone.Asia.Novosibirsk "Asia/Novosibirsk" >
<!ENTITY pref.timezone.Asia.Omsk "Asia/Omsk" >
<!ENTITY pref.timezone.Asia.Oral "Asia/Oral" >
<!ENTITY pref.timezone.Asia.Phnom_Penh "Asia/Phnom_Penh" >
<!ENTITY pref.timezone.Asia.Pontianak "Asia/Pontianak" >
<!ENTITY pref.timezone.Asia.Pyongyang "Asia/Pyongyang" >
<!ENTITY pref.timezone.Asia.Qatar "Asia/Qatar" >
<!ENTITY pref.timezone.Asia.Qyzylorda "Asia/Qyzylorda" >
<!ENTITY pref.timezone.Asia.Rangoon "Asia/Rangoon" >
<!ENTITY pref.timezone.Asia.Riyadh "Asia/Riyadh" >
<!ENTITY pref.timezone.Asia.Saigon "Asia/Saigon" >
<!ENTITY pref.timezone.Asia.Sakhalin "Asia/Sakhalin" >
<!ENTITY pref.timezone.Asia.Samarkand "Asia/Samarkand" >
<!ENTITY pref.timezone.Asia.Seoul "Asia/Seoul" >
<!ENTITY pref.timezone.Asia.Shanghai "Asia/Shanghai" >
@@ -285,7 +300,6 @@
<!ENTITY pref.timezone.Asia.Tehran "Asia/Tehran" >
<!ENTITY pref.timezone.Asia.Thimphu "Asia/Thimphu" >
<!ENTITY pref.timezone.Asia.Tokyo "Asia/Tokyo" >
<!ENTITY pref.timezone.Asia.Ujung_Pandang "Asia/Ujung_Pandang" >
<!ENTITY pref.timezone.Asia.Ulaanbaatar "Asia/Ulaanbaatar" >
<!ENTITY pref.timezone.Asia.Urumqi "Asia/Urumqi" >
<!ENTITY pref.timezone.Asia.Vientiane "Asia/Vientiane" >
@@ -342,6 +356,7 @@
<!ENTITY pref.timezone.Europe.Luxembourg "Europe/Luxembourg" >
<!ENTITY pref.timezone.Europe.Madrid "Europe/Madrid" >
<!ENTITY pref.timezone.Europe.Malta "Europe/Malta" >
<!ENTITY pref.timezone.Europe.Mariehamn "Europe/Mariehamn" >
<!ENTITY pref.timezone.Europe.Minsk "Europe/Minsk" >
<!ENTITY pref.timezone.Europe.Monaco "Europe/Monaco" >
<!ENTITY pref.timezone.Europe.Moscow "Europe/Moscow" >

View File

@@ -1,27 +1,25 @@
#
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/MPL/
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is mozilla.org code.
# The Original Code is Sun Microsystems code.
#
# The Initial Developer of the Original Code is Sun Microsystems, Inc.
# Portions created by Sun Microsystems are Copyright (C) 2006 Sun
# Microsystems, Inc. All Rights Reserved.
#
# Original Author: Daniel Boelzle (daniel.boelzle@sun.com)
# The Initial Developer of the Original Code is
# Sun Microsystems, Inc.
# Portions created by the Initial Developer are Copyright (C) 2007
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#
# Daniel Boelzle <daniel.boelzle@sun.com>
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
@@ -29,11 +27,11 @@
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the NPL, indicate your
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the NPL, the GPL or the LGPL.
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****

View File

@@ -65,20 +65,37 @@
<!ENTITY lightning.sidebar.agenda.label "Agenda">
<!ENTITY lightning.sidebar.todo.label "Todo">
<!ENTITY lightning.sidebar.calendars.label "Calendars">
<!ENTITY lightning.sidebar.new.label "New…">
<!ENTITY lightning.sidebar.edit.label "Edit…">
<!ENTITY lightning.sidebar.delete.label "Delete">
<!ENTITY lightning.calendar.label "Calendar">
<!ENTITY lightning.calendar.accesskey "C">
<!ENTITY lightning.sidebar.showCompletedTasks.label "Show completed tasks">
<!-- Mode Toolbar -->
<!ENTITY lightning.toolbar.mail.label "Mail">
<!ENTITY lightning.toolbar.calendar.label "Calendar">
<!ENTITY lightning.toolbar.task.label "Task">
<!-- Customize Toolbar Dialog -->
<!ENTITY customize.toolbar.selector.label "Toolbar:">
<!ENTITY customize.toolbar.selector.mode "Mode Toolbar">
<!ENTITY customize.toolbar.selector.mail "Mail Toolbar">
<!ENTITY customize.toolbar.selector.calendar "Calendar Toolbar">
<!ENTITY customize.toolbar.location.label "Location:">
<!ENTITY customize.toolbar.location.top "Top">
<!ENTITY customize.toolbar.location.bottom "Bottom">
<!-- Messenger Toolbar -->
<!ENTITY lightning.toolbar.dayview.label "Day View">
<!ENTITY lightning.toolbar.dayview.accesskey "D">
<!ENTITY lightning.toolbar.weekview.label "Week View">
<!ENTITY lightning.toolbar.weekview.accesskey "W">
<!ENTITY lightning.toolbar.monthview.label "Month View">
<!ENTITY lightning.toolbar.monthview.accesskey "M">
<!ENTITY lightning.toolbar.edit.calendar.label "Edit selected calendar">
<!ENTITY lightning.toolbar.edit.calendar.accesskey "E">
<!ENTITY lightning.toolbar.delete.calendar.label "Delete selected calendar">
<!ENTITY lightning.toolbar.delete.calendar.accesskey "t">
<!ENTITY lightning.toolbar.day.label "Day">
<!ENTITY lightning.toolbar.day.accesskey "D">
<!ENTITY lightning.toolbar.week.label "Week">
<!ENTITY lightning.toolbar.week.accesskey "W">
<!ENTITY lightning.toolbar.multiweek.label "Multiweek">
<!ENTITY lightning.toolbar.multiweek.accesskey "u">
<!ENTITY lightning.toolbar.month.label "Month">
<!ENTITY lightning.toolbar.month.accesskey "M">
<!--Views' context menu-->
<!ENTITY lightning.context.deleteitem.accesskey "D">

View File

@@ -109,6 +109,7 @@
<!ENTITY event.private.label "Private" >
<!ENTITY event.public.label "Public" >
<!ENTITY event.confidential.label "Time and Date Only" >
<!ENTITY event.priority.label "Importance:">
<!ENTITY event.reminder.none.label "No reminder " >
<!ENTITY event.reminder.5minutes.before.label "5 minutes before" >

View File

@@ -8,9 +8,14 @@ fr
ga-IE
hu
it
mk
mn
nb-NO
nl
pa-IN
pl
pt-BR
ru
sk
sl
sv-SE

Binary file not shown.

Before

Width:  |  Height:  |  Size: 828 B

After

Width:  |  Height:  |  Size: 796 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Some files were not shown because too many files have changed in this diff Show More