void CqFramebuffer::resize()
{
	Fl::lock();
	std::stringstream title;
	title << m_bookName;
	int fw = defaultWidth;
	int fh = defaultHeight;
	if(m_associatedImage)
	{
		if(m_associatedImage->frameWidth() > 0 && m_associatedImage->frameHeight() > 0)
		{
			fw = m_associatedImage->frameWidth();
			fh = m_associatedImage->frameHeight();
		}
		title << ": " << m_associatedImage->name();
	}
	m_uiImageWidget->size(fw, fh);
	// Resize the window if it's too small, leave it if it's big enough or bigger.
	if( w() < fw || h() < fh )
		resize(x(), y(), min(fw, static_cast<int>(Fl::w()*0.9)), min(fh, static_cast<int>(Fl::h()*0.9)));
	centerImageWidget();
	redraw();

	m_title = title.str();
	label(m_title.c_str());
	m_doResize = false;
	Fl::unlock();
}
void CqFramebuffer::resize(int X, int Y, int W, int H)
{
	// is the window actually getting resized? (might just be moved)
	bool isResizing = W != w() || H != h();
	// call parent's resize()
	Fl_Double_Window::resize(X, Y, W, H);
	if(isResizing)
		centerImageWidget();
}
int CqCenterScroll::handle(int event)
{
	switch(event)
	{
		case FL_PUSH:
			if(Fl::event_button() == FL_MIDDLE_MOUSE)
			{
				m_prevDragX = Fl::event_x();
				m_prevDragY = Fl::event_y();
				return 1;
			}
			break;
		case FL_RELEASE:
			if(Fl::event_button() == FL_MIDDLE_MOUSE)
				return 1;
			break;
		case FL_DRAG:
			if(Fl::event_button() == FL_MIDDLE_MOUSE)
			{
				position(xposition() - (Fl::event_x() - m_prevDragX),
						yposition() - (Fl::event_y() - m_prevDragY));
				m_prevDragX = Fl::event_x();
				m_prevDragY = Fl::event_y();
				return 1;
			}
			break;
		case FL_KEYDOWN:
		case FL_SHORTCUT:
			int key = Fl::event_key();
			switch(key)
			{
				case 'h':
					if(Fl::event_alt())
						return 0;
						// passthrough
				case FL_Home:
					centerImageWidget();
					return 1;
					break;

				// Ignore cursors, so that the browser gets them.
				case FL_Up:
				case FL_Down:
				case FL_Left:
				case FL_Right:
					return 0;
			}
			break;
	}
	if(m_imageWidget.handle(event))
		return(1);
	else
		return Fl_Scroll::handle(event);
}
// Event handler for the framebuffer
int CqFramebuffer::handle(int event)
{
	switch(event)
	{
		case FL_FOCUS:
			return 1;
		case FL_UNFOCUS:
			return 1;
		case FL_KEYDOWN:
			{
				boost::shared_ptr<Aqsis::CqImage>& image
					= m_uiImageWidget->image();
				int key = Fl::event_key();
				if(Fl::event_ctrl())
				{
					switch(key)
					{
						case FL_KP + '+':
							incSubImage(true);
							return 1;
						case FL_KP + '-':
							incSubImage(false);
							return 1;
					}
				}
				else if(Fl::event_shift())
				{
					switch(key)
					{
						case 'r':
							if(image)
								image->reloadFromFile();
							return 1;
					}
				}
				else
				{
					switch(key)
					{
						case 'h':
							// 'Home' widget back to center
							centerImageWidget();
							m_scroll->redraw();
							return 1;
						case FL_KP + '+':
							incZoom(1);
							return 1;
						case FL_KP + '-':
							incZoom(-1);
							return 1;
					}
				}
			}
			break;
		case FL_KEYUP:
			break;
		case FL_PUSH:
			switch (Fl::event_button())
			{
				case FL_MIDDLE_MOUSE:
					// pan
					m_lastPos[0] = Fl::event_x();
					m_lastPos[1] = Fl::event_y();
					return 1;
			}
			break;
		case FL_RELEASE:
			switch (Fl::event_button())
			{
				case FL_MIDDLE_MOUSE:
					fl_cursor(FL_CURSOR_DEFAULT, FL_FOREGROUND_COLOR,
							FL_BACKGROUND_COLOR);
					return 1;
			}
			break;
		case FL_DRAG:
			switch (Fl::event_button())
			{
				case FL_MIDDLE_MOUSE:
					fl_cursor(FL_CURSOR_MOVE, FL_FOREGROUND_COLOR,
							FL_BACKGROUND_COLOR);
					int dx = Fl::event_x() - m_lastPos[0];
					int dy = Fl::event_y() - m_lastPos[1];
					m_uiImageWidget->position(m_uiImageWidget->x() + dx,
							m_uiImageWidget->y()+dy);
					m_scroll->redraw();
					m_lastPos[0] = Fl::event_x();
					m_lastPos[1] = Fl::event_y();
					return 1;
			}
			break;
		case FL_MOUSEWHEEL:
			{
				if(Fl::event_ctrl())
					incSubImage(Fl::event_dy() < 0);
				else 
					incZoom(-Fl::event_dy());
				return 1;
			}
			break;
	}
	return Fl_Window::handle(event);
}