public void paint(Graphics g)
		{
			if(mElementDimension == null)
			{
				mElementDimension = new Dimension();
				FontMetrics fm = g.getFontMetrics(mFonts[0]);
				mElementDimension.width = fm.charWidth('_')+1;
				mElementDimension.height = fm.getHeight()+1;
			}
			
			Stack<AffineTransform> transforms = new Stack<AffineTransform>();
			
			Graphics2D g2D = (Graphics2D) g;

			// Background elements drawing
			
			// Text drawing
			// Setup text model
			
			
			g2D.translate(0, mElementDimension.height);
			
			for(int x = 0; x < mElementCount.width; x++)
				for(int y = 0; y < mElementCount.height; y++)
				{
					if(mElements[y][x].mValue != 0)
					{
						transforms.push(g2D.getTransform());
						
						g2D.translate(x * mElementDimension.width, y * mElementDimension.height);
						
						g2D.setFont(mFonts[(mElements[y][x].mFlags & 3)]);
						g2D.setColor(mElements[y][x].mBackColor);
						g2D.fillRect(0, -mElementDimension.height+1, mElementDimension.width, mElementDimension.height);
						g2D.setColor(mElements[y][x].mColor);
						if((mElements[y][x].mFlags & StyleFlipped) > 0)
						{
							g2D.translate(mElementDimension.width, 0);
							g2D.scale(-1,  1);
						}
						if((mElements[y][x].mFlags & StyleInverted) > 0)
						{
							g2D.scale(1,  -1);
							g2D.translate(0,  mElementDimension.height-5);
						}
						if((mElements[y][x].mFlags & StyleUnderlined) > 0)
							g2D.drawLine(0, 0, mElementDimension.width, 0);
						g2D.drawString("" + mElements[y][x].mValue, 0, 0);
						
						g2D.setTransform(transforms.pop());
					}
				}
			if(mCaretState && mCaretVisible)
			{
				transforms.push(g2D.getTransform());
			
				g2D.translate(mElementCursorPosition.x * mElementDimension.width, mElementCursorPosition.y * mElementDimension.height);
				g2D.drawString("_", 0, 0);
			
				g2D.setTransform(transforms.pop());
			
			}
			// Overhead elements
			
		}