Mozilla/mozilla/cmd/xfe/src/Dashboard.cpp
ramiro%netscape.com d763585f82 Unbreak the taskbar some more.
git-svn-id: svn://10.0.0.236/trunk@10612 18797224-902f-48f8-a5cc-f745e15eee43
1998-09-21 20:50:25 +00:00

1353 lines
34 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
/*
Dashboard.cpp -- The chrome along the bottom of a frame.
Created: Chris Toshok <toshok@netscape.com>, 11-Oct-1996
*/
#include "rosetta.h"
#include "Dashboard.h"
#include "Button.h"
#include "View.h"
#include "DisplayFactory.h"
#include "MozillaApp.h"
#include "prefapi.h"
#include "PopupMenu.h"
#include "BookmarkFrame.h"
// #ifdef MOZ_TASKBAR
// #include "TaskBar.h"
// #endif
#include <Xm/Form.h>
#include <Xm/MwmUtil.h>
#include <Xfe/DashBoard.h>
#if 0
#define D(x) x
#else
#define D(x)
#endif
// Widget names
#define DASH_BOARD_NAME "dashBoard"
#define ICON_TOOL_BAR_NAME "securityBar"
#define PROGRESS_BAR_NAME "progressBar"
#define STATUS_BAR_NAME "statusBar"
#define MIN_DASH_HEIGHT 22
#ifdef MOZ_TASKBAR
#define FLOATING_SHELL_NAME "mozillaComponentBar"
#define FLOATING_ORIGIN_OFFSET 50
#define MAX_FLOATING_RAISES_PER_SECOND 4
/* static */ MenuSpec
XFE_Dashboard::m_floatingPopupMenuSpec[] =
{
{ xfeCmdFloatingTaskBarAlwaysOnTop, TOGGLEBUTTON },
{ xfeCmdFloatingTaskBarHorizontal, PUSHBUTTON },
{ xfeCmdFloatingTaskBarClose, PUSHBUTTON },
{ NULL }
};
//
// Task Bar members
//
/* static */ XFE_PopupMenu *
XFE_Dashboard::m_floatingPopup = NULL;
/* static */ XFE_TaskBar *
XFE_Dashboard::m_floatingTaskBar = NULL;
/* static */ Widget
XFE_Dashboard::m_floatingShell = NULL;
/* static */ XP_Bool
XFE_Dashboard::m_floatingDocked = False;
/* static */ time_t
XFE_Dashboard::m_floatingLastRaisedTime = 0;
/* static */ int
XFE_Dashboard::m_floatingTimesRaisedPerSecond = 0;
// Needed to determine the colormap used by the floating shell colormap
extern "C" Colormap fe_getColormap(fe_colormap *colormap);
//////////////////////////////////////////////////////////////////////////
//
// XFE_Dashboard notification callbacks names
//
//////////////////////////////////////////////////////////////////////////
/* static */ const char *
XFE_Dashboard::taskBarDockedCallback = "XFE_Dashboard::taskBarDockedCallback";
/* static */ const char *
XFE_Dashboard::taskBarUndockedCallback = "XFE_Dashboard::taskBarUndockedCallback";
#endif
// Needed to truncate strings
extern "C" XmString fe_StringChopCreate(char* message, char* tag,
XmFontList font_list,int maxwidth);
//////////////////////////////////////////////////////////////////////////
XFE_Dashboard::XFE_Dashboard(XFE_Component * toplevel_component,
Widget parent,
XFE_Frame * frame,
XP_Bool have_task_bar)
: XFE_Component(toplevel_component)
{
m_parentFrame = frame;
m_statusBar = NULL;
m_progressBar = NULL;
m_securityIcon = NULL;
m_signedIcon = NULL;
m_securityBar = NULL;
#ifdef MOZ_TASKBAR
m_dockedTaskBar = NULL;
#endif
#ifndef MOZ_TASKBAR
have_task_bar = False;
#endif
m_securityRegistered = False;
m_widget = XtVaCreateWidget(DASH_BOARD_NAME,
xfeDashBoardWidgetClass,
parent,
XmNusePreferredWidth, False,
XmNusePreferredHeight, True,
XmNshowDockedTaskBar, have_task_bar,
XmNminHeight, MIN_DASH_HEIGHT,
NULL);
#ifdef MOZ_TASKBAR
// Add floating shell map/unmap callbacks to dashboard
XtAddCallback(m_widget,
XmNfloatingMapCallback,
XFE_Dashboard::floatingMappingCB,
(XtPointer) this);
XtAddCallback(m_widget,
XmNfloatingUnmapCallback,
XFE_Dashboard::floatingMappingCB,
(XtPointer) this);
#endif
#ifdef MOZ_TASKBAR
// Start the floating shell only if a parent frame is given
if (m_parentFrame)
{
// The task bar parent frame will always be the bookmark frame since
// it is the only frame that sticks around for the duration of the
// application.
XFE_Frame * taskBarParentFrame = NULL;
// If our parent frame is the bookmark frame, use that.
if (m_parentFrame->getType() == FRAME_BOOKMARK)
{
taskBarParentFrame = m_parentFrame;
}
// Otherwise get the bookmark frame
else
{
taskBarParentFrame = XFE_BookmarkFrame::getBookmarkFrame();
}
// Make sure the floating task bar is started
XFE_Dashboard::startFloatingTaskBar(taskBarParentFrame);
}
// Create the docked task bar if needed
if (have_task_bar)
{
createDockedTaskBar();
}
#endif
installDestroyHandler();
}
//////////////////////////////////////////////////////////////////////////
XFE_Dashboard::~XFE_Dashboard()
{
D( printf ("In XFE_Dashboard::~XFE_Dashboard\n");)
// Unregister status notifications with top level component
if (m_statusBar)
{
m_toplevel->unregisterInterest(
Command::commandArmedCallback,
this,
(XFE_FunctionNotification)showCommandStringNotice_cb);
m_toplevel->unregisterInterest(
Command::commandDisarmedCallback,
this,
(XFE_FunctionNotification)eraseCommandStringNotice_cb);
m_toplevel->unregisterInterest(
XFE_View::statusNeedsUpdatingMidTruncated,
this,
(XFE_FunctionNotification)setStatusTextNotice_cb);
m_toplevel->unregisterInterest(
XFE_View::statusNeedsUpdating,
this,
(XFE_FunctionNotification)setStatusTextNotice_cb);
}
// Unregister progress notifications with parent
if (m_parentFrame && m_progressBar)
{
#if defined(GLUE_COMPO_CONTEXT)
m_parentFrame->unregisterInterest(
XFE_Component::progressBarCylonStart,
this,
startCylonNotice_cb);
m_parentFrame->unregisterInterest(
XFE_Component::progressBarCylonStop,
this,
stopCylonNotice_cb);
m_parentFrame->unregisterInterest(
XFE_Component::progressBarCylonTick,
this,
tickCylonNotice_cb);
m_parentFrame->unregisterInterest(
XFE_Component::progressBarUpdatePercent,
this,
progressBarUpdatePercentNotice_cb);
m_parentFrame->unregisterInterest(
XFE_Component::progressBarUpdateText,
this,
progressBarUpdateTextNotice_cb);
#else
m_parentFrame->unregisterInterest(
XFE_Frame::progressBarCylonStart,
this,
startCylonNotice_cb);
m_parentFrame->unregisterInterest(
XFE_Frame::progressBarCylonStop,
this,
stopCylonNotice_cb);
m_parentFrame->unregisterInterest(
XFE_Frame::progressBarCylonTick,
this,
tickCylonNotice_cb);
m_parentFrame->unregisterInterest(
XFE_Frame::progressBarUpdatePercent,
this,
progressBarUpdatePercentNotice_cb);
m_parentFrame->unregisterInterest(
XFE_Frame::progressBarUpdateText,
this,
progressBarUpdateTextNotice_cb);
#endif /* GLUE_COMPO_CONTEXT */
}
// Unregister parent frame update chrome notifications if needed
if (m_parentFrame && m_securityRegistered)
{
m_parentFrame->unregisterInterest(
XFE_View::chromeNeedsUpdating,
this,
(XFE_FunctionNotification)update_cb);
}
D( printf ("Leaving XFE_Dashboard::~XFE_Dashboard\n");)
}
#if defined(GLUE_COMPO_CONTEXT)
void XFE_Dashboard::connect2Dashboard(XFE_Component *compo)
{
if (compo) {
// register dashboard events
compo->registerInterest(XFE_View::statusNeedsUpdating,
this,
(XFE_FunctionNotification)setStatusTextNotice_cb);
// Register progress notifications with parent
compo->registerInterest(XFE_Component::progressBarCylonStart,
this,
startCylonNotice_cb);
compo->registerInterest(XFE_Component::progressBarCylonStop,
this,
stopCylonNotice_cb);
compo->registerInterest(XFE_Component::progressBarCylonTick,
this,
tickCylonNotice_cb);
compo->registerInterest(XFE_Component::progressBarUpdatePercent,
this,
progressBarUpdatePercentNotice_cb);
compo->registerInterest(XFE_Component::progressBarUpdateText,
this,
progressBarUpdateTextNotice_cb);
}/* compo */
}
void XFE_Dashboard::disconnectFromDashboard(XFE_Component *compo)
{
if (compo) {
// register dashboard events
compo->unregisterInterest(XFE_View::statusNeedsUpdating,
this,
(XFE_FunctionNotification)setStatusTextNotice_cb);
// Register progress notifications with parent
compo->unregisterInterest(XFE_Component::progressBarCylonStart,
this,
startCylonNotice_cb);
compo->unregisterInterest(XFE_Component::progressBarCylonStop,
this,
stopCylonNotice_cb);
compo->unregisterInterest(XFE_Component::progressBarCylonTick,
this,
tickCylonNotice_cb);
compo->unregisterInterest(XFE_Component::progressBarUpdatePercent,
this,
progressBarUpdatePercentNotice_cb);
compo->unregisterInterest(XFE_Component::progressBarUpdateText,
this,
progressBarUpdateTextNotice_cb);
}/* compo */
}
#endif /* GLUE_COMPO_CONTEXT */
//////////////////////////////////////////////////////////////////////////
void
XFE_Dashboard::createStatusBar()
{
XP_ASSERT( XfeIsAlive(m_widget) );
m_statusBar =
XtVaCreateWidget(STATUS_BAR_NAME,
xfeLabelWidgetClass,
m_widget,
XmNusePreferredHeight, True,
XmNusePreferredWidth, False,
XmNtruncateProc, fe_StringChopCreate,
XmNtraversalOn, True,
XmNhighlightThickness, 0,
NULL);
// Clear the status bar to begin with
setStatusText("");
// Register status notifications with top level component
m_toplevel->registerInterest(
Command::commandArmedCallback,
this,
(XFE_FunctionNotification)showCommandStringNotice_cb);
m_toplevel->registerInterest(
Command::commandDisarmedCallback,
this,
(XFE_FunctionNotification)eraseCommandStringNotice_cb);
m_toplevel->registerInterest(
XFE_View::statusNeedsUpdatingMidTruncated,
this,
(XFE_FunctionNotification)setStatusTextNotice_cb);
m_toplevel->registerInterest(
XFE_View::statusNeedsUpdating,
this,
(XFE_FunctionNotification)setStatusTextNotice_cb);
}
//////////////////////////////////////////////////////////////////////////
void
XFE_Dashboard::createProgressBar()
{
XP_ASSERT( XfeIsAlive(m_widget) );
XP_ASSERT( m_progressBar == NULL );
m_progressBar =
XtVaCreateManagedWidget(PROGRESS_BAR_NAME,
xfeProgressBarWidgetClass,
m_widget,
XmNusePreferredHeight, True,
XmNusePreferredWidth, False,
XmNtraversalOn, True,
XmNhighlightThickness, 0,
NULL);
// Clear the progress bar to begin with
setProgressBarText("");
setProgressBarPercent(0);
// Register progress notifications with parent
if (m_parentFrame)
{
#if defined(GLUE_COMPO_CONTEXT)
m_parentFrame->registerInterest(
XFE_Component::progressBarCylonStart,
this,
startCylonNotice_cb);
m_parentFrame->registerInterest(
XFE_Component::progressBarCylonStop,
this,
stopCylonNotice_cb);
m_parentFrame->registerInterest(
XFE_Component::progressBarCylonTick,
this,
tickCylonNotice_cb);
m_parentFrame->registerInterest(
XFE_Component::progressBarUpdatePercent,
this,
progressBarUpdatePercentNotice_cb);
m_parentFrame->registerInterest(
XFE_Component::progressBarUpdateText,
this,
progressBarUpdateTextNotice_cb);
#else
m_parentFrame->registerInterest(
XFE_Frame::progressBarCylonStart,
this,
startCylonNotice_cb);
m_parentFrame->registerInterest(
XFE_Frame::progressBarCylonStop,
this,
stopCylonNotice_cb);
m_parentFrame->registerInterest(
XFE_Frame::progressBarCylonTick,
this,
tickCylonNotice_cb);
m_parentFrame->registerInterest(
XFE_Frame::progressBarUpdatePercent,
this,
progressBarUpdatePercentNotice_cb);
m_parentFrame->registerInterest(
XFE_Frame::progressBarUpdateText,
this,
progressBarUpdateTextNotice_cb);
#endif /* GLUE_COMPO_CONTEXT */
}
}
//////////////////////////////////////////////////////////////////////////
#ifdef MOZ_TASKBAR
void
XFE_Dashboard::createDockedTaskBar()
{
XP_ASSERT( XfeIsAlive(m_widget) );
XP_ASSERT( XFE_Dashboard::floatingTaskBarIsAlive() );
XP_ASSERT( m_parentFrame != NULL );
// Create the docked taskbar here
m_dockedTaskBar = new XFE_TaskBar(m_widget,m_parentFrame,False);
// Add action cb to dashboard
XtAddCallback(m_dockedTaskBar->getUndockButton(),
XmNactivateCallback,
XFE_Dashboard::floatingActionCB,
(XtPointer) this);
// Install the global floating task bar on the dash board
XtVaSetValues(m_widget,XmNfloatingShell,m_floatingShell,NULL);
}
#endif
//////////////////////////////////////////////////////////////////////////
void
XFE_Dashboard::createSecurityBar()
{
XP_ASSERT( m_parentFrame != NULL );
XP_ASSERT( XfeIsAlive(m_widget) );
/* XP_ASSERT( m_securityBar == NULL ); */
if (!m_parentFrame)
return;
HG12928
}
//////////////////////////////////////////////////////////////////////////
void
XFE_Dashboard::addSecurityIcon()
{
XP_ASSERT( m_parentFrame != NULL );
XP_ASSERT( XfeIsAlive(m_widget) );
/* XP_ASSERT( XfeIsAlive(m_securityBar) ); */
/* XP_ASSERT( m_securityIcon == NULL ); */
if (!m_parentFrame)
return;
HG00298
}
//////////////////////////////////////////////////////////////////////////
void
XFE_Dashboard::addSignedIcon()
{
XP_ASSERT( m_parentFrame != NULL );
XP_ASSERT( XfeIsAlive(m_widget) );
/* XP_ASSERT( XfeIsAlive(m_securityBar) ); */
/* XP_ASSERT( m_signedIcon == NULL ); */
if (!m_parentFrame)
return;
HG02920
}
//////////////////////////////////////////////////////////////////////////
void
XFE_Dashboard::configureSecurityBar()
{
HG02092
}
//////////////////////////////////////////////////////////////////////////
void
XFE_Dashboard::setStatusText(const char * text)
{
D(
Widget top = m_toplevel->getBaseWidget();
printf("%s: setStatusText: %s\n", XtName(top), text);
)
XP_ASSERT( XfeIsAlive(m_statusBar) );
#if defined(DEBUG_tao_)
printf("\nXFE_Dashboard::setStatusText=%s\n", text?text:"");
#endif
XfeLabelSetStringPSZ(m_statusBar,(String) text);
}
//////////////////////////////////////////////////////////////////////////
void
XFE_Dashboard::setProgressBarText(const char * text)
{
XP_ASSERT( XfeIsAlive(m_progressBar) );
#if defined(DEBUG_tao_)
printf("\nXFE_Dashboard::setProgressBarText=%s\n", text?text:"");
#endif
XfeLabelSetStringPSZ(m_progressBar,(String) text);
}
//////////////////////////////////////////////////////////////////////////
void
XFE_Dashboard::setProgressBarPercent(int percent)
{
XP_ASSERT( XfeIsAlive(m_progressBar) );
#if defined(DEBUG_tao_)
printf("\nXFE_Dashboard::setProgressBarPercent=%d\n", percent);
#endif
if (percent < 0)
{
percent = 0;
}
if (percent > 100)
{
percent = 100;
}
XfeProgressBarSetPercentages(m_progressBar,0,percent);
}
//////////////////////////////////////////////////////////////////////////
void
XFE_Dashboard::startCylon()
{
XP_ASSERT( XfeIsAlive(m_progressBar) );
#if defined(DEBUG_tao_)
printf("\nXFE_Dashboard::startCylon\n");
#endif
XfeProgressBarCylonStart(m_progressBar);
}
//////////////////////////////////////////////////////////////////////////
void
XFE_Dashboard::stopCylon()
{
XP_ASSERT( XfeIsAlive(m_progressBar) );
#if defined(DEBUG_tao_)
printf("\nXFE_Dashboard::stopCylon\n");
#endif
XfeProgressBarCylonStop(m_progressBar);
}
//////////////////////////////////////////////////////////////////////////
void
XFE_Dashboard::tickCylon()
{
XP_ASSERT( XfeIsAlive(m_progressBar) );
#if defined(DEBUG_tao_)
printf("\nXFE_Dashboard::tickCylon\n");
#endif
XfeProgressBarCylonTick(m_progressBar);
}
//////////////////////////////////////////////////////////////////////////
#ifdef MOZ_TASKBAR
/* static */ void
XFE_Dashboard::dockTaskBar()
{
if (!XFE_Dashboard::isTaskBarDocked() &&
XFE_Dashboard::floatingTaskBarIsAlive())
{
XtUnmanageChild(XFE_Dashboard::m_floatingTaskBar->getBaseWidget());
}
}
//////////////////////////////////////////////////////////////////////////
/* static */ void
XFE_Dashboard::unDockTaskBar()
{
if (XFE_Dashboard::isTaskBarDocked() &&
XFE_Dashboard::floatingTaskBarIsAlive())
{
if (m_floatingTaskBar->numEnabledButtons())
{
XtManageChild(XFE_Dashboard::m_floatingTaskBar->getBaseWidget());
}
}
}
//////////////////////////////////////////////////////////////////////////
/* static */ void
XFE_Dashboard::toggleTaskBar()
{
if (XFE_Dashboard::isTaskBarDocked())
{
XFE_Dashboard::unDockTaskBar();
}
else
{
XFE_Dashboard::dockTaskBar();
}
}
//////////////////////////////////////////////////////////////////////////
/* static */ XP_Bool
XFE_Dashboard::isTaskBarDocked()
{
return (XFE_Dashboard::floatingTaskBarIsAlive() &&
!XtIsManaged(XFE_Dashboard::m_floatingTaskBar->getBaseWidget()));
}
//////////////////////////////////////////////////////////////////////////
/* static */ XP_Bool
XFE_Dashboard::floatingTaskBarIsAlive()
{
return (XfeIsAlive(XFE_Dashboard::m_floatingShell) &&
XfeIsAlive(XFE_Dashboard::m_floatingTaskBar->getBaseWidget()));
}
//////////////////////////////////////////////////////////////////////////
/* static */ void
XFE_Dashboard::startFloatingTaskBar(XFE_Frame * parentFrame)
{
// Make sure the floating task bar has not been started yet
if (XFE_Dashboard::floatingTaskBarIsAlive())
{
return;
}
XP_ASSERT( parentFrame != NULL );
Widget app_shell;
int decor;
int funcs;
fe_colormap * floating_fe_colormap;
Colormap floating_colormap;
Visual * floating_visual;
int floating_depth;
// Access the application shell (confusingly known as top_level)
app_shell = FE_GetToplevelWidget();
// Make sure the display factory is running
fe_startDisplayFactory(app_shell);
// Obtain the colormap / depth / and visual to use for the
// floating shell. These cannot be gotten from the parent
// frame, since it might go away.
floating_fe_colormap =
XFE_DisplayFactory::theFactory()->getSharedColormap();
floating_colormap = fe_getColormap(floating_fe_colormap);
floating_depth =
XFE_DisplayFactory::theFactory()->getVisualDepth();
floating_visual =
XFE_DisplayFactory::theFactory()->getVisual();
// Set the window manager decorations and functions
decor = MWM_DECOR_BORDER | MWM_DECOR_TITLE | MWM_DECOR_MENU;
funcs = MWM_FUNC_CLOSE | MWM_FUNC_MOVE;
// Create the floating shell
XFE_Dashboard::m_floatingShell =
XtVaCreatePopupShell(FLOATING_SHELL_NAME,
xmDialogShellWidgetClass,
app_shell,
XmNvisual, floating_visual,
XmNdepth, floating_depth,
XmNcolormap, floating_colormap,
XmNallowShellResize, True,
XmNmwmDecorations, decor,
XmNmwmFunctions, funcs,
XmNdeleteResponse, XmDO_NOTHING,
NULL);
// Create the floating task bar
XFE_Dashboard::m_floatingTaskBar = new XFE_TaskBar(m_floatingShell,
parentFrame,True);
// Create the floating taskbar popup menu
XFE_Dashboard::m_floatingPopup = new XFE_PopupMenu("taskBarContextMenu",
parentFrame,
FE_GetToplevelWidget());
XFE_Dashboard::m_floatingPopup->setMenuSpec(XFE_Dashboard::m_floatingPopupMenuSpec);
// Add popup menu post event handler to floating task bar items
XfeChildrenAddEventHandler(
XFE_Dashboard::m_floatingTaskBar->getToolBar(),
ButtonPressMask,
True,
&XFE_Dashboard::floatingButtonEH,
NULL);
// Add floating shell configure event handler
XtAddEventHandler(XFE_Dashboard::m_floatingShell,
StructureNotifyMask | VisibilityChangeMask,
True,
&XFE_Dashboard::floatingConfigureEH,
NULL);
// Look for the defaults, in which case we use a decent default
// Why are the defaults (-1,-1) ???
if (fe_globalPrefs.task_bar_x == -1)
{
fe_globalPrefs.task_bar_x = FLOATING_ORIGIN_OFFSET;
}
if (fe_globalPrefs.task_bar_y == -1)
{
fe_globalPrefs.task_bar_y = FLOATING_ORIGIN_OFFSET;
}
XFE_Dashboard::setFloatingTaskBarPosition(fe_globalPrefs.task_bar_x,
fe_globalPrefs.task_bar_y);
XFE_Dashboard::setFloatingTaskBarHorizontal(fe_globalPrefs.task_bar_horizontal);
XFE_Dashboard::setFloatingTaskBarOnTop(fe_globalPrefs.task_bar_ontop);
// Set the title for the floating dialog
XFE_Dashboard::m_floatingTaskBar->setFloatingTitle(" ");
// Set the initial state of the taskbar
XFE_Dashboard::m_floatingDocked = True;
// Undock the taskbar if needed
if (fe_globalPrefs.task_bar_floating)
{
unDockTaskBar();
}
}
//////////////////////////////////////////////////////////////////////////
/* static */ void
XFE_Dashboard::stopFloatingTaskBar()
{
// Return right away if the task bar is docked
if (XFE_Dashboard::isTaskBarDocked())
{
return;
}
// Make sure the floating task bar is still alive
if (!XFE_Dashboard::floatingTaskBarIsAlive())
{
return;
}
// Simpy unmap the taskbar shell. The widgets (and objects) will be
// destroyed later.
XUnmapWindow(XtDisplay(XFE_Dashboard::m_floatingShell),
XtWindow(XFE_Dashboard::m_floatingShell));
}
//////////////////////////////////////////////////////////////////////////
/* static */ void
XFE_Dashboard::setFloatingTaskBarPosition(int32 x,int32 y)
{
XP_ASSERT( XFE_Dashboard::floatingTaskBarIsAlive() );
// printf("setFloatingTaskBarPosition(%d,%d)\n",x,y);
// Update the prefs
fe_globalPrefs.task_bar_x = x;
fe_globalPrefs.task_bar_y = y;
// Update the floating shell's position
XtVaSetValues(XFE_Dashboard::m_floatingShell,
XmNx,x,
XmNy,y,
NULL);
}
//////////////////////////////////////////////////////////////////////////
/* static */ void
XFE_Dashboard::setFloatingTaskBarHorizontal(XP_Bool horizontal)
{
XP_ASSERT( XFE_Dashboard::floatingTaskBarIsAlive() );
// Update the prefs
fe_globalPrefs.task_bar_horizontal = horizontal;
// Update the floating task bar's orientation
XtVaSetValues(m_floatingTaskBar->getToolBar(),
XmNorientation,horizontal ? XmHORIZONTAL : XmVERTICAL,
NULL);
}
//////////////////////////////////////////////////////////////////////////
/* static */ void
XFE_Dashboard::setFloatingTaskBarOnTop(XP_Bool ontop)
{
XP_ASSERT( XFE_Dashboard::floatingTaskBarIsAlive() );
// Update the prefs
fe_globalPrefs.task_bar_ontop = ontop;
// Raise the shell if needed
if (fe_globalPrefs.task_bar_ontop)
{
XFE_Dashboard::raiseFloatingShell();
}
}
//////////////////////////////////////////////////////////////////////////
/* static */ void
XFE_Dashboard::showFloatingTaskBar(XFE_Frame * parentFrame)
{
// Make sure the floating task bar is started
XFE_Dashboard::startFloatingTaskBar(parentFrame);
// Manage the floating task bar
XtManageChild(XFE_Dashboard::m_floatingTaskBar->getBaseWidget());
}
#endif
//////////////////////////////////////////////////////////////////////////
XFE_CALLBACK_DEFN(XFE_Dashboard, showCommandStringNotice)
(XFE_NotificationCenter * /* obj */,
void * /* clientData */,
void * callData)
{
CommandType cmd = (CommandType)callData;
XFE_Component* component = (XFE_Component*)m_toplevel;
char* doc_string = NULL;
if (!XfeIsAlive(m_widget))
return;
if (component!= NULL)
doc_string = component->getDocString(cmd);
#ifdef DEBUG
if (doc_string == NULL)
doc_string = "No Documentation String for this command!!!!";
#endif
setStatusText(doc_string);
}
//////////////////////////////////////////////////////////////////////////
XFE_CALLBACK_DEFN(XFE_Dashboard, eraseCommandStringNotice)
(XFE_NotificationCenter * /* obj */,
void * /* clientData */,
void * /* callData */)
{
if (!XfeIsAlive(m_widget))
return;
setStatusText("");
}
//////////////////////////////////////////////////////////////////////////
XFE_CALLBACK_DEFN(XFE_Dashboard, setStatusTextNotice)
(XFE_NotificationCenter * /* obj */,
void * /* clientData */,
void * callData)
{
if (!XfeIsAlive(m_widget))
return;
setStatusText((char *) callData);
}
//////////////////////////////////////////////////////////////////////////
XFE_CALLBACK_DEFN(XFE_Dashboard, update)
(XFE_NotificationCenter * /* obj */,
void * /* clientData */,
void * /* callData */)
{
if (!XfeIsAlive(m_widget))
return;
HG28999
}
//////////////////////////////////////////////////////////////////////////
XFE_CALLBACK_DEFN(XFE_Dashboard, doSecurityCommand)
(XFE_NotificationCenter * /* obj */,
void * /* clientData */,
void * callData)
{
XFE_DoCommandArgs *cmdArgs = (XFE_DoCommandArgs *)callData;
if (!XfeIsAlive(m_widget))
return;
HG09219
}
//////////////////////////////////////////////////////////////////////////
XFE_CALLBACK_DEFN(XFE_Dashboard, startCylonNotice)
(XFE_NotificationCenter * /* obj */,
void * /* clientData */,
void * /* callData */)
{
if (!XfeIsAlive(m_widget))
return;
startCylon();
}
//////////////////////////////////////////////////////////////////////////
XFE_CALLBACK_DEFN(XFE_Dashboard, stopCylonNotice)
(XFE_NotificationCenter * /* obj */,
void * /* clientData */,
void * /* callData */)
{
if (!XfeIsAlive(m_widget))
return;
stopCylon();
}
//////////////////////////////////////////////////////////////////////////
XFE_CALLBACK_DEFN(XFE_Dashboard, tickCylonNotice)
(XFE_NotificationCenter * /* obj */,
void * /* clientData */,
void * /* callData */)
{
if (!XfeIsAlive(m_widget))
return;
tickCylon();
}
//////////////////////////////////////////////////////////////////////////
XFE_CALLBACK_DEFN(XFE_Dashboard, progressBarUpdatePercentNotice)
(XFE_NotificationCenter * /* obj */,
void * /* clientData */,
void * callData)
{
if (!XfeIsAlive(m_widget))
return;
setProgressBarPercent((int) callData);
}
//////////////////////////////////////////////////////////////////////////
XFE_CALLBACK_DEFN(XFE_Dashboard, progressBarUpdateTextNotice)
(XFE_NotificationCenter * /* obj */,
void * /* clientData */,
void * callData)
{
setProgressBarText((char *) callData);
}
//////////////////////////////////////////////////////////////////////////
#ifdef MOZ_TASKBAR
/* static */ void
XFE_Dashboard::floatingMappingCB(Widget /* w */,
XtPointer clientData,
XtPointer callData)
{
XFE_Dashboard * db = (XFE_Dashboard *) clientData;
XmAnyCallbackStruct * cbs = (XmAnyCallbackStruct *) callData;
XP_ASSERT( db != NULL );
XP_ASSERT( cbs != NULL );
if (!db || !cbs)
{
return;
}
switch(cbs->reason)
{
case XmCR_FLOATING_MAP:
if (XFE_Dashboard::m_floatingDocked)
{
// Floating task bar is now docked
XFE_Dashboard::m_floatingDocked = False;
// Increase the top level window count for the floating taskbar
fe_WindowCount++;
// Notify all frames about the change in top level window count
XFE_MozillaApp::theApp()->notifyInterested(
XFE_MozillaApp::changeInToplevelFrames,
(void *) fe_WindowCount);
D( printf(" map = undock (%s,%s) count = %d\n",
XtName(db->m_parentFrame->getBaseWidget()),
XtName(XtParent(XtParent(w))),
fe_WindowCount); );
// Update the prefs
fe_globalPrefs.task_bar_floating = True;
// Make sure the floating shell is raised
XFE_Dashboard::raiseFloatingShell();
}
break;
case XmCR_FLOATING_UNMAP:
if (!XFE_Dashboard::m_floatingDocked)
{
// Floating task bar is now un docked
XFE_Dashboard::m_floatingDocked = True;
// Decrease the top level window count for the floating taskbar
fe_WindowCount--;
// Notify all frames about the change in top level window count
XFE_MozillaApp::theApp()->notifyInterested(
XFE_MozillaApp::changeInToplevelFrames,
(void *) fe_WindowCount);
D( printf("unmap = dock (%s,%s) count = %d\n",
XtName(db->m_parentFrame->getBaseWidget()),
XtName(XtParent(XtParent(w))),
fe_WindowCount); );
// If no windows are left after closing the floating task bar, exit
if (XFE_MozillaApp::theApp()->toplevelWindowCount() == 0)
{
// If the app is closed from the taskbar, then the
// instead of changing the pref to not floating, we make
// sure it remains floating.
fe_globalPrefs.task_bar_floating = True;
XFE_MozillaApp::theApp()->exit(0);
}
else
{
// Update the prefs
fe_globalPrefs.task_bar_floating = False;
}
}
break;
}
}
//////////////////////////////////////////////////////////////////////////
/* static */ void
XFE_Dashboard::floatingActionCB(Widget /* w */,
XtPointer clientData,
XtPointer /* callData */)
{
XFE_Dashboard * db = (XFE_Dashboard *) clientData;
XP_ASSERT( db != NULL );
if (!db)
{
return;
}
XFE_Dashboard::unDockTaskBar();
}
//////////////////////////////////////////////////////////////////////////
/* static */ void
XFE_Dashboard::floatingButtonEH(Widget /* w */,
XtPointer /* clientData */,
XEvent * event,
Boolean * cont)
{
// Make sure Button3 was pressed
if ((event->type == ButtonPress) && (event->xbutton.button == Button3))
{
XFE_Dashboard::m_floatingPopup->position(event);
XFE_Dashboard::m_floatingPopup->show();
XFE_Dashboard::m_floatingPopup->raise();
}
*cont = True;
}
//////////////////////////////////////////////////////////////////////////
/* static */ void
XFE_Dashboard::floatingConfigureEH(Widget /* w */,
XtPointer /* clientData */,
XEvent * event,
Boolean * cont)
{
// Configure
if (event->type == ConfigureNotify)
{
Position x = XfeRootX(XFE_Dashboard::m_floatingShell);
Position y = XfeRootY(XFE_Dashboard::m_floatingShell);
Position offset_x;
Position offset_y;
// Try and obtain the offset occupied by the wm decorations
if (!XfeShellGetDecorationOffset(XFE_Dashboard::m_floatingShell,
&offset_x,&offset_y))
{
offset_x = 0;
offset_y = 0;
}
x -= offset_x;
y -= offset_y;
// Update the new position in the prefs
fe_globalPrefs.task_bar_x = x;
fe_globalPrefs.task_bar_y = y;
}
// Visibility
else if (event->type == VisibilityNotify)
{
// If it is, raise the floating shell
XFE_Dashboard::raiseFloatingShell();
}
*cont = True;
}
#endif
//////////////////////////////////////////////////////////////////////////
void
XFE_Dashboard::setShowSecurityIcon(XP_Bool state)
{
XP_ASSERT( XfeIsAlive(m_widget) );
// Create the security icon only if it is not disabled through resources.
if (!XfeChildIsEnabled(m_widget,
xfeCmdViewSecurity,
"ViewSecurity",
True))
{
return;
}
HG89219
}
//////////////////////////////////////////////////////////////////////////
void
XFE_Dashboard::setShowStatusBar(XP_Bool state)
{
XP_ASSERT( XfeIsAlive(m_widget) );
// Create the status bar if needed
if (!m_statusBar)
{
createStatusBar();
}
XfeSetManagedState(m_statusBar,state);
}
//////////////////////////////////////////////////////////////////////////
void
XFE_Dashboard::setShowProgressBar(XP_Bool state)
{
XP_ASSERT( XfeIsAlive(m_widget) );
// Create the progress bar if needed
if (!m_progressBar)
{
createProgressBar();
}
XfeSetManagedState(m_progressBar,state);
}
//////////////////////////////////////////////////////////////////////////
void
XFE_Dashboard::setShowSignedIcon(XP_Bool state)
{
XP_ASSERT( XfeIsAlive(m_widget) );
// Create the signed icon only if it is not disabled through resources.
if (!XfeChildIsEnabled(m_widget,
xfeCmdViewSecurity,
"ViewSecurity",
True))
{
return;
}
HG82198
}
//////////////////////////////////////////////////////////////////////////
XP_Bool
XFE_Dashboard::isSecurityIconShown()
{
return (HG20303);
}
//////////////////////////////////////////////////////////////////////////
XP_Bool
XFE_Dashboard::isSignedIconShown()
{
return (HG02023);
}
//////////////////////////////////////////////////////////////////////////
XP_Bool
XFE_Dashboard::processTraversal(XmTraversalDirection direction)
{
HG93649
// Try the progress bar
if (XfeIsAlive(m_progressBar) &&
XmProcessTraversal(m_progressBar,direction))
{
return True;
}
// Try the status bar
if (XfeIsAlive(m_statusBar) &&
XmProcessTraversal(m_statusBar,direction))
{
return True;
}
#ifdef MOZ_TASKBAR
// Try the task bar
if ((m_dockedTaskBar && m_dockedTaskBar->isAlive()) &&
XmProcessTraversal(m_dockedTaskBar->getBaseWidget(),direction))
{
return True;
}
#endif
// Try the base widget
if (XfeIsAlive(m_widget) &&
XmProcessTraversal(m_widget,direction))
{
return True;
}
return False;
}
//////////////////////////////////////////////////////////////////////////
#ifdef MOZ_TASKBAR
/* static */ XFE_TaskBar *
XFE_Dashboard::getTaskBar()
{
return m_dockedTaskBar;
}
//////////////////////////////////////////////////////////////////////////
/* static */ void
XFE_Dashboard::raiseFloatingShell()
{
XP_ASSERT( XFE_Dashboard::floatingTaskBarIsAlive() );
// Dont raise the window if the XmDisplay is grabbed or a tooltip is
// showing
if (XfeDisplayIsUserGrabbed(XFE_Dashboard::m_floatingShell) ||
fe_ToolTipIsShowing())
{
return;
}
// If the taskbar needs to be ontop, raise it
if (fe_globalPrefs.task_bar_ontop)
{
// The time 'now'
time_t time_now = time(NULL);
// The time difference between 'now' and the last time we were called
time_t time_diff = time_now - m_floatingLastRaisedTime;
// If the difference is 0, then we are being called more than once
// in one second.
if (time_diff == 0)
{
m_floatingTimesRaisedPerSecond++;
}
// Otherwise we are being called after a 'long' interval and we
// reset the time/sec counter.
else
{
m_floatingTimesRaisedPerSecond = 0;
}
// If the times/sec counter is more than a magic number, then we
// are being called too often and we are most likely in an infinite
// loop fighting with another window that also wants to be always
// on top.
if (m_floatingTimesRaisedPerSecond <= MAX_FLOATING_RAISES_PER_SECOND)
{
Widget shell = XFE_Dashboard::m_floatingShell;
// Place window on top
XWindowChanges changes;
changes.stack_mode = Above;
XReconfigureWMWindow(XtDisplay(shell),
XtWindow(shell),
XScreenNumberOfScreen(XtScreen(shell)),
CWStackMode,&changes);
m_floatingLastRaisedTime = time_now;
}
}
}
//////////////////////////////////////////////////////////////////////////
/* static */ XFE_TaskBar *
XFE_Dashboard::getFloatingTaskBar()
{
XP_ASSERT( XFE_Dashboard::floatingTaskBarIsAlive() );
return XFE_Dashboard::m_floatingTaskBar;
}
//////////////////////////////////////////////////////////////////////////
extern "C" void
fe_showTaskBar(Widget /* toplevel */)
{
XFE_BookmarkFrame * parentFrame = XFE_BookmarkFrame::getBookmarkFrame();
XP_ASSERT( parentFrame != NULL );
XFE_Dashboard::showFloatingTaskBar(parentFrame);
}
//////////////////////////////////////////////////////////////////////////
#endif