/*****************************************************************************
*
* Autor: Joachim Raidl
* Adresse: Joachim.Raidl@iname.com
* Klasse: XPaneInfo, XStatusBar
* Files: XStatusBar.Cpp, XStatusBar.H
* Beschreibung: Mit dieser Klasse können komplexe Status-Zeilen verwaltet
* werden. So können in jedem Pane Texte, Bitmaps oder
* Progress-Bars dargestellt, horizontal, vertikal oder
* diagonal gescrollt und links, rechts oder zentriert
* ausgerichtet werden. Auch kann jeder Zeit zwischen den
* einzelnen Modi hin- und hergeschaltet werden. Für jede
* Pane kann sowohl ein Einschalt- als auch ein Ausschalt-
* text, -hintergrund oder -bitmap definiert werden.
* Funktionen: operator=(), SetDefault(), SetFont(), SetMode(),
* (XPaneInfo) SetFgColor(), SetBkColor(), SetBitmap(), SetText(),
* SetNumber(), HScroll(), VScroll(),
* Funktionen: CreateStatusBar(), SetIndicators(), OnPaint(),
* (XStatusBar) DrawSizing(), DrawTextPane(), DrawBitmapPane(),
* DrawProgressPane(), GetXPaneInfo(), OnTimer(),
* SetStyle(), SetWidth(), GetStyle(), GetWidth(), GetID(),
* OnDestroy(), SavePane(), RestorePane(),
* GetPaneAtPosition(), OnMouseMove(),
* OnLButtonUp(), OnMButtonUp(), OnRButtonUp(),
* OnLButtonDown(), OnMButtonDown(), OnRButtonDown(),
* OnLButtonDblClk(), OnMButtonDblClk(), OnRButtonDblClk(),
*
****************************************************************************/
#include "StdAfx.h"
#include "XStatusBar.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
volatile static char jrrcid[] = "%J%";
#define IDC_JRLIB_STATUSBAR_TIMER 20000
/*****************************************************************************
* Klasse: XPaneInfo
* Funktion: XPaneInfo, ~XPaneInfo
* Parameter: -
* Return:
*
* Der Konstruktor initialisiert ein Pane. Im Desturktor wird eine eventuell
* vorhandene Progress-Kontrolle wieder gelöscht.
****************************************************************************/
XPaneInfo::XPaneInfo()
{
progress = NULL;
hScrollPos = 0;
vScrollPos = 0;
SetDefault();
}
XPaneInfo::XPaneInfo(const XPaneInfo& paneInfo)
{
for (int i = 0; i < 2; i++)
{
fgColor[i] = paneInfo.fgColor[i];
bkColor[i] = paneInfo.bkColor[i];
string[i] = paneInfo.string[i];
}
font = paneInfo.font;
mode = paneInfo.mode;
progress = NULL;
hScrollPos = paneInfo.hScrollPos;
vScrollPos = paneInfo.vScrollPos;
}
XPaneInfo::~XPaneInfo()
{
if (progress) delete progress;
progress = NULL;
}
/*****************************************************************************
* Klasse: XPaneInfo
* Funktion: operator=
* Parameter: paneInfo Zweites XPaneInfo-Element, dessen Informationen
* kopiert werden.
* Return: Kopie des XPaneInfo-Elements
*
* Zuweisungsoperator.
* !!! ACHTUNG !!! 'progress' wird nicht kopiert! Ein eventuell vorhandener
* Progress-Bar wird gelöscht.
****************************************************************************/
XPaneInfo XPaneInfo::operator=(const XPaneInfo& paneInfo)
{
for (int i = 0; i < 2; i++)
{
fgColor[i] = paneInfo.fgColor[i];
bkColor[i] = paneInfo.bkColor[i];
string[i] = paneInfo.string[i];
}
font = paneInfo.font;
mode = paneInfo.mode;
hScrollPos = paneInfo.hScrollPos;
vScrollPos = paneInfo.vScrollPos;
if (progress) delete progress;
progress = NULL;
return *this;
}
/*****************************************************************************
* Klasse: XPaneInfo
* Funktion: SetDefault
* Parameter: -
* Return: -
*
* Hier werden die Members initialisiert.
****************************************************************************/
void XPaneInfo::SetDefault()
{
bkColor[1] = COLORREF(GetSysColor(COLOR_MENU));
bkColor[0] = bkColor[1];
fgColor[1] = GetSysColor(COLOR_MENUTEXT);
fgColor[0] = RGB(GetRValue(bkColor[1])/2, GetGValue(bkColor[1])/2, GetBValue(bkColor[1])/2);
mode = XSB_TEXT | DT_LEFT;
SetFont(CFont::FromHandle((HFONT) GetStockObject(ANSI_VAR_FONT)));
if (progress) delete progress;
progress = NULL;
}
/*****************************************************************************
* Klasse: XPaneInfo
* Funktion: SetFont
* Parameter: name Name der Schriftart (Bsp.: Arial)
* size Größe der Schriftart in 1/10 Pt (Bsp.: 120)
* Return: -
*
* Setzt den Font für ein Pane anhand des Fontsnamens und der Punktgröße
* (10 * Point).
****************************************************************************/
void XPaneInfo::SetFont(LPCSTR name, int size)
{
CFont pointFont;
pointFont.CreatePointFont(size, name);
pointFont.GetLogFont(&font);
}
/*****************************************************************************
* Klasse: XPaneInfo
* Funktion: SetMode
* Parameter: newMode Neuer Anzeigemodus
* Return: -
*
* Setzt den Modus für das aktuelle Pane. Falls dieses Pane zuvor mit einer
* ProgressCtrl besetzt war, wird diese zuvor gelöscht.
****************************************************************************/
void XPaneInfo::SetMode(int newMode)
{
if ((mode = newMode) & XSB_PROGRESS)
{
if (!progress)
{
UINT style = WS_VISIBLE | WS_CHILD;
if (mode & XSB_SMOOTH) style |= PBS_SMOOTH;
progress = new CProgressCtrl();
progress->Create(style, CRect(0,0,0,0), XStatusBar::aktBar, 1);
}
}
else if (progress)
{
delete progress;
progress = NULL;
}
}
/*****************************************************************************
* Klasse: XPaneInfo
* Funktion: SetFgColor
* Parameter: on Text-Farbe im aktiven Zustand
* off Text-Farbe im inaktiven Zustand
* Return: -
*
* Definiert die Farben für einen angezeigten Text. Hierbei können zwei
* Farben für den aktiven und den inaktiven Zustand definiert werden. Wird
* die zweite Farbe vergessen, wird sie mit der halben Intensität der Hinter-
* grundfarbe vordefiniert.
****************************************************************************/
void XPaneInfo::SetFgColor(COLORREF on, COLORREF off)
{
fgColor[1] = on;
if (off != -1)
fgColor[0] = off;
else
{
COLORREF bk = GetSysColor(COLOR_MENU);
fgColor[0] = RGB(GetRValue(bk)/2, GetGValue(bk)/2, GetBValue(bk)/2);
}
}
/*****************************************************************************
* Klasse: XPaneInfo
* Funktion: SetBkColor
* Parameter: on Hintergrundfarbe im aktiven Zustand
* off Hintergrundfarbe im inaktiven Zustand
* Return: -
*
* Definiert die Hintergrundfarben für einen angezeigten Text. Hierbei können
* zwei Farben für den aktiven und den inaktiven Zustand definiert werden.
* Wird die zweite Farbe vergessen, wird sie mit der Hintergrundfarbe vor-
* definiert.
****************************************************************************/
void XPaneInfo::SetBkColor(COLORREF on, COLORREF off)
{
bkColor[1] = on;
if (off != -1) bkColor[0] = off;
else bkColor[0] = GetSysColor(COLOR_MENU);
}
/*****************************************************************************
* Klasse: XPaneInfo
* Funktion: SetBitmap, SetText, SetNumber
* Parameter: newBitmap Name des im Pane anzuzeigenden Bitmaps
* newText Im Pane anzuzeigender Text
* newNumber Im Pane anzuzeigende Nummer
* Return: -
*
* Mit diesen Funktionen werden die Bitmaps, Texte oder Nummern für die
* Anzeige in dem aktuellen Pane gesetzt.
****************************************************************************/
void XPaneInfo::SetBitmap(LPCSTR newOnBitmap, LPCSTR newOffBitmap)
{
string[1] = newOnBitmap;
string[0] = newOffBitmap;
}
void XPaneInfo::SetText(LPCSTR newOnText, LPCSTR newOffText)
{
string[1] = newOnText;
string[0] = newOffText;
}
void XPaneInfo::Se