plugins/consoles/guicons/inc/guicons.h
changeset 0 7f656887cf89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/consoles/guicons/inc/guicons.h	Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,362 @@
+// guicons.h
+// 
+// Copyright (c) 2010 Accenture. All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+// 
+// Initial Contributors:
+// Accenture - Initial contribution
+//
+
+#ifndef __GUICONS_H__
+#define __GUICONS_H__
+
+#include <coecntrl.h>
+#include <e32cons.h>
+#include <fshell/consoleproxy.h>
+#include <fshell/consoleextensions.h>
+
+static const TInt KFontBitmapWidthChars = 8;
+static const TInt KFontBitmapHeightChars = 12;
+static const TInt KFontBitmapFirstCharCode = ' ';
+static const TInt KNumGlyphs = KFontBitmapWidthChars * KFontBitmapHeightChars;
+static const TInt KFontBitmapLastCharCode = KFontBitmapFirstCharCode + KNumGlyphs - 1;
+static const TInt KDefaultCursorHeightPercentage = 20;
+static const TInt KTabSize = 4;
+static const TInt KNumColors = 16;
+
+class CConsoleControl;
+class CConsoleLine;
+class CConsoleFont;
+class MGuiConsoleReader;
+class MConsoleUi;
+class TBufferPosition;
+class TConsCursorPosition;
+class TViewPosition;
+class CImageDecoder;
+class RImageDecodeThreadParams;
+
+IMPORT_C CServer2* StartGuiConsServerL(const TDesC& aServerName, MConsoleUi& aConsoleUi);
+
+class MConsoleUi
+	{
+public:
+	virtual void HandleNewConsoleL(CConsoleControl* aConsole) = 0;
+	virtual void HandleConsoleClosed(CConsoleControl* aConsole) = 0;
+	virtual void ConsoleTitleChangedL(const CConsoleControl*, const TDesC&){};
+	virtual TInt GetConsoleBufferSize() = 0;
+	virtual const TDesC& GetConsoleFont() = 0;
+	};
+
+/**
+Position relative to the text buffer. The cursor window and view window will be somewhere within this.
+*/
+class TBufferPosition
+	{
+public:
+	TBufferPosition(const CConsoleControl& aConsole, TPoint aPosition);
+	TBufferPosition(const CConsoleControl& aConsole, TInt aX, TInt aY);
+	TBufferPosition(const TConsCursorPosition& aCursorPosition);
+	TBufferPosition(const TViewPosition& aViewPosition);
+public:
+	const CConsoleControl& iConsole;
+	TPoint iPoint;
+	};
+
+/**
+Position relative to the cursor window - i.e. the area that the cursor can move around in
+*/
+class TConsCursorPosition
+	{
+public:
+	TConsCursorPosition(const CConsoleControl& aConsole, TPoint aPosition);
+	TConsCursorPosition(const CConsoleControl& aConsole, TInt aX, TInt aY);
+	TConsCursorPosition(const TBufferPosition& aBufferPosition);
+	TConsCursorPosition(const TViewPosition& aViewPosition);
+public:
+	const CConsoleControl& iConsole;
+	TPoint iPoint;
+	};
+
+/**
+Position relative to the view window - i.e. the area of the console seen on the screen
+*/
+class TViewPosition
+	{
+public:
+	TViewPosition(const CConsoleControl& aConsole, TPoint aPosition);
+	TViewPosition(const CConsoleControl& aConsole, TInt aX, TInt aY);
+	TViewPosition(const TConsCursorPosition& aCursorPosition);
+	TViewPosition(const TBufferPosition& aBufferPosition);
+public:
+	const CConsoleControl& iConsole;
+	TPoint iPoint;
+	};
+
+/**
+Position in pixels relative to CConsoleControl's rectangle.
+*/
+class TScreenPosition
+	{
+public:
+	TScreenPosition(const CConsoleControl& aConsole, TPoint aPosition);
+	TScreenPosition(const CConsoleControl& aConsole, TInt aX, TInt aY);
+	TScreenPosition(const TViewPosition& aViewPosition);
+public:
+	const CConsoleControl& iConsole;
+	TPoint iPoint;
+	};
+
+class TConsoleCursor
+	{
+public:
+	TConsoleCursor(CConsoleControl& aOwner);
+	void SetFont(const CConsoleFont& aFont);
+	TConsCursorPosition Position() const;
+	void SetPosAbs(TConsCursorPosition aPos);
+	void SetPosRel(TConsCursorPosition aPos);
+	void SetHeight(TInt aPercentage);
+	
+	void Hide();
+
+	void operator++(int);
+	void operator--(int);
+	void operator+=(TUint aHowMuch);
+	void operator-=(TUint aHowMuch);
+	void Down();
+	void Up();
+	
+	void Update();
+private:
+	void BoundsCheck();
+private:
+	CConsoleControl& iOwner;
+	TSize iGlyphSize;
+	TPoint iPosition;
+	TTextCursor iTextCursor;
+	TInt iTextCursorOffset;
+	};
+
+class MGuiConsoleReader
+	{
+public:
+	virtual void ReadComplete(TInt aStatus) = 0;
+	};
+	
+class CGuiConsole	: public CConsoleBase
+					, public MGuiConsoleReader
+					, public MProxiedConsole
+	{
+public:
+	IMPORT_C CGuiConsole(CConsoleControl& aControl);
+	
+	IMPORT_C CConsoleControl& Control();
+	
+	// from CConsoleBase
+	IMPORT_C virtual TInt Create(const TDesC &aTitle,TSize aSize);
+	IMPORT_C virtual void Read(TRequestStatus& aStatus);
+	IMPORT_C virtual void ReadCancel();
+	IMPORT_C virtual void Write(const TDesC &aDes);
+	IMPORT_C virtual TPoint CursorPos() const;
+	IMPORT_C virtual void SetCursorPosAbs(const TPoint &aPoint);
+	IMPORT_C virtual void SetCursorPosRel(const TPoint &aPoint);
+	IMPORT_C virtual void SetCursorHeight(TInt aPercentage);
+	IMPORT_C virtual void SetTitle(const TDesC &aTitle);
+	IMPORT_C virtual void ClearScreen();
+	IMPORT_C virtual void ClearToEndOfLine();
+	IMPORT_C virtual TSize ScreenSize() const;
+	IMPORT_C virtual TKeyCode KeyCode() const;
+	IMPORT_C virtual TUint KeyModifiers() const;
+	IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1);
+	
+	// from MGuiConsoleReader
+	virtual void ReadComplete(TInt aStatus);
+	// from MProxiedConsole:
+	virtual void Open();
+	virtual void Close();
+	virtual CConsoleBase* Console();
+	virtual void Read(CConsoleProxySession& aSession);
+private:
+	~CGuiConsole();
+private:
+	CConsoleControl& iControl;
+	TInt iRefCount;
+	TRequestStatus* iReadStatus;
+	CConsoleProxySession* iReader;
+	};
+
+class CConsoleControl : public CCoeControl
+	{
+public:
+	IMPORT_C static CConsoleControl* NewL(TInt aBufferSize, MConsoleUi* aUi = NULL);
+	IMPORT_C static CConsoleControl* NewL(TInt aBufferSize, const TDesC& aFontFile, MConsoleUi* aUi = NULL);
+	IMPORT_C virtual ~CConsoleControl();
+	IMPORT_C void Closed();
+	
+	IMPORT_C void InjectKeysL(const TDesC& aKeys);
+	IMPORT_C TBool FivewayNavIsDisplaying() const;
+	IMPORT_C void SetDisplayFivewayNav(TBool aShow);
+	
+	// from CCoeControl:
+	IMPORT_C virtual void Draw(const TRect& aRect) const;
+	IMPORT_C virtual void SizeChanged();
+	IMPORT_C virtual TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType);
+	IMPORT_C virtual TCoeInputCapabilities InputCapabilities() const;
+	IMPORT_C virtual void FocusChanged(TDrawNow aDrawNow);
+	IMPORT_C virtual void HandlePointerEventL(const TPointerEvent& aPointerEvent);
+	
+	// CConsoleBase API
+	IMPORT_C void Read(MGuiConsoleReader &aStatus);
+	IMPORT_C void ReadCancel();
+	IMPORT_C void Write(const TDesC &aDes);
+	IMPORT_C TPoint CursorPos() const;
+	IMPORT_C void SetCursorPosAbs(const TPoint &aPoint);
+	IMPORT_C void SetCursorPosRel(const TPoint &aPoint);
+	IMPORT_C void SetCursorHeight(TInt aPercentage);
+	IMPORT_C void SetTitle(const TDesC &aTitle);
+	IMPORT_C void ClearScreen();
+	IMPORT_C void ClearToEndOfLine();
+	IMPORT_C TSize ScreenSize() const;
+	IMPORT_C TKeyCode KeyCode() const;
+	IMPORT_C TUint KeyModifiers() const;
+	
+	IMPORT_C void ViewScrollUp();
+	IMPORT_C void ViewScrollDown();
+	IMPORT_C void ViewPageUp();
+	IMPORT_C void ViewPageDown();
+	IMPORT_C void ViewHome();
+	IMPORT_C void ViewEnd();
+	IMPORT_C TInt SetAttributes(TUint aAttributes, ConsoleAttributes::TColor aForegroundColor, ConsoleAttributes::TColor aBackgroundColor);
+	
+	// calls from CConsoleCursor:
+	void CursorWindowScrollDown();
+	
+	TPoint ViewPosition() const;
+	TPoint CursorWindowPosition() const;
+	TSize GlyphSize() const;
+	void ActivateL();
+	void StartBlinking();
+	
+private:
+	CConsoleControl(MConsoleUi* aUi, TInt aBufferSize);
+	void ConstructL(CConsoleFont* aFont);
+	void SizeChangedL();
+	
+	void DrawLine(TViewPosition aLine, CBitmapContext& aDrawTo) const;
+	TRect LineRect(TViewPosition aLine) const;
+	
+	TBool IsSpecialChar(TChar aChar) const;
+	void HandleSpecialChar(TChar aChar);
+	
+	void SendKey();
+	
+	CConsoleLine* GetLine(TBufferPosition aLine) const;
+	void ViewMoved();
+	void Invalidate5Way();
+	enum TButton { EUp, EDown, ELeft, ERight, ECenter, ENumButtons };
+	void SimulateKeyL(TButton aButton);
+	void WriteL(const TDesC &aDes);
+
+	static TInt BlinkCallback(TAny* aPtr);
+	
+private:
+	MConsoleUi* iUi;
+	CConsoleFont* iFont;
+	RPointerArray<CConsoleLine> iBuffer;
+	CPeriodic* iBlinkTimer;
+	TSize iSizeChars;
+	TConsoleCursor iCursor;
+	TPoint iCursorWindow;
+	TPoint iViewWindow;
+
+	MGuiConsoleReader* iReader;
+	RArray<TKeyEvent> iKeyQueue;
+	TKeyEvent iCurrentKey; 
+	
+	TPoint iDragStart;
+	TBool iIgnoringDrags;
+
+	TRect iButtonRects[ENumButtons];
+	TBool iDrawNavigator;
+	ConsoleAttributes::TAttributes iCurrentAttributes;
+	
+	TInt iBufferSize;
+	TBool iBlinkOn;
+	};
+	
+class CConsoleFont : public CBase
+	{
+public:
+	IMPORT_C static CConsoleFont* NewL(const TDesC& aFontFile);
+	IMPORT_C static CConsoleFont* NewL(const TDesC8& aEncodedFontImage);
+	IMPORT_C ~CConsoleFont();
+	IMPORT_C TSize GlyphSize() const;
+	IMPORT_C void DrawChar(TChar aChar, CBitmapContext& aDrawTo, TPoint aPosPixels, TRgb aColor);
+	void PrepareForegroundColorL(TRgb aColor);
+private:
+	CConsoleFont();
+	void ConstructL(const TDesC& aFontFile);
+	void ConstructL(const TDesC8& aEncodedFontImage);
+	void ConstructL(RImageDecodeThreadParams& aThreadParams);
+	CFbsBitmap* ForegroundBitmap(TRgb aColor);
+private:
+	TFixedArray<CFbsBitmap*, KNumGlyphs> iChars;
+	TFixedArray<CFbsBitmap*, KNumColors> iColors;
+	TRect iGlyphRect;
+	};
+
+class RAttributeMap
+	{
+public:
+	RAttributeMap();
+	void Close();
+	void Reset();
+	void AddL(TInt aPosition, TInt aLineWidth, const ConsoleAttributes::TAttributes& aAttributes);
+	void RemoveFrom(TInt aPosition);
+	TInt NumberOfBlocks() const;
+	void GetBlock(TInt aIndex, TInt aLineWidth, TInt& aStartPosition, TInt& aEndPosition, ConsoleAttributes::TAttributes& aAttributes) const;
+private:
+	class TAttributes
+		{
+	public:
+		TAttributes(TInt aPosition, const ConsoleAttributes::TAttributes& aAttributes);
+		TBool operator==(const TAttributes& aAttributes) const;
+	public:
+		TInt iPosition;
+		ConsoleAttributes::TAttributes iAttributes;
+		};
+private:
+	RArray<TAttributes> iAttributes;
+	};
+	
+NONSHARABLE_CLASS(CConsoleLine) : public CBase
+	{
+public:
+	static CConsoleLine* NewL(CConsoleControl& aControl, const CConsoleFont& aFont, TInt aWidth);
+	~CConsoleLine();
+	
+	void SetWidthL(TInt aNewWidth);
+	
+	void SetL(TInt aIndex, TUint8 aChar, const ConsoleAttributes::TAttributes& aAttributes);
+	void Clear();
+	void ClearFrom(TBufferPosition aPosition);
+	
+	void Draw(CBitmapContext& aDrawTo, TViewPosition aViewPosition) const;
+	TBool NeedToBlink(TBool aBlinkOn);
+private:
+	CConsoleLine(CConsoleControl& aControl, const CConsoleFont& aFont);
+	void ConstructL(TInt aWidth);
+	TUint16 At(TInt aPos) const;
+private:
+	CConsoleControl& iControl;
+	const CConsoleFont& iFont;
+	RBuf8 iText;
+	RAttributeMap iAttributeMap;
+	TInt iWidth;
+	TBool iBlinkOn;
+	};
+
+
+#endif //__GUICONS_H__