// TODO: Avoid flickering!
void MScrollView::UpdateScrollInfo()
{
    MRect rcClient;
    MScrollView::GetClientRect(&rcClient);

    SCROLLINFO si;

    si.cbSize = sizeof(si);
    si.fMask = SIF_ALL | SIF_DISABLENOSCROLL;
    si.nMin = 0;
    si.nMax = Extent().cx;
    si.nPage = rcClient.Width();
    if (static_cast<UINT>(si.nMax) < si.nPage)
        ScrollPos().x = 0;
    si.nPos = ScrollPos().x;
    SetHScrollInfo(&si, TRUE);

    si.cbSize = sizeof(si);
    si.fMask = SIF_ALL | SIF_DISABLENOSCROLL;
    si.nMin = 0;
    si.nMax = Extent().cy;
    si.nPage = rcClient.Height();
    if (static_cast<UINT>(si.nMax) < si.nPage)
        ScrollPos().y = 0;
    si.nPos = ScrollPos().y;
    SetVScrollInfo(&si, TRUE);

    ::InvalidateRect(m_hwndParent, NULL, TRUE);
}
Example #2
0
bool SjCoverBrowser::GotoUrl(const wxString& url)
{
	bool    ret = FALSE;
	long    colIndex;
	SjCol*  col = g_mainFrame->m_columnMixer.GetMaskedCol(url, colIndex);
	if( col )
	{
		delete col;

		// check index
		col = NULL;
		if( colIndex >= 0 )
		{
			// goto column
			m_scrollY = 0;
			OnVScroll(IDT_WORKSPACE_V_SCROLL, colIndex/m_coversXCount, FALSE/*redraw*/);
			SetVScrollInfo();

			// select the correct row
			g_mainFrame->m_columnMixer.SelectAll(FALSE);
			for( colIndex = 0; colIndex < m_allocatedCoverCount; colIndex++ )
			{
				col = m_allocatedCover[colIndex];
				if( col )
				{
					for( int rowIndex = 0; rowIndex < col->m_rowCount; rowIndex++ )
					{
						SjRow* row = col->m_rows[rowIndex];
						if( row->m_url == url )
						{
							if( row->IsSelectable()==2 )
							{
								row->Select(TRUE);
							}

							ret = TRUE; // URL found!
						}
					}
				}
			}

			m_window->Refresh();
			m_window->Update();
		}
	}
	return ret;
}
Example #3
0
void SjCoverBrowser::GotoPos(const wxString& guid, long viewOffset)
{
	m_preservedVisible = guid;

	long    colIndex;
	SjCol*  col = g_mainFrame->m_columnMixer.GetMaskedCol(guid, colIndex);
	if( col )
	{
		delete col;

		// check index
		col = NULL;
		if( colIndex >= 0 )
		{
			// goto column
			m_scrollY = 0;
			OnVScroll(IDT_WORKSPACE_V_SCROLL, colIndex/m_coversXCount, FALSE/*redraw*/);
			SetVScrollInfo();
		}
	}
}
Example #4
0
void SjCoverBrowser::Realize(bool reloadColumnMixer, bool keepColIndex)
{
	// save old index
	long oldCoverXCount = m_coversXCount;
	long oldCoverIndex = m_applRowIndex*m_coversXCount;

	// recalculate the needed stuff
	if( reloadColumnMixer )
	{
		m_scrollY = 0;
		m_applCoverCount = g_mainFrame->m_columnMixer.GetMaskedColCount();
	}

	SjSkinValue value;
	value.value         = 0;
	value.vmax          = 0;
	value.thumbSize     = 0;
	g_mainFrame->SetSkinTargetValue(IDT_WORKSPACE_H_SCROLL, value);

	CalcRowStuff();

	// try to set a new, fine row index
	if( oldCoverXCount != m_coversXCount )
	{
		m_applRowIndex = oldCoverIndex / m_coversXCount;
	}

	if( m_applRowIndex >= (m_applRowCount-m_coversYCount) )
		m_applRowIndex = (m_applRowCount-m_coversYCount);

	if( m_applRowIndex<0 || !keepColIndex )
		m_applRowIndex = 0;

	// recalculate the rest
	CalcPositions();

	SetVScrollInfo();

	m_lastTooltipCover      = NULL;
}
Example #5
0
bool SjCoverBrowser::GotoCover(long offset, bool selectOneInRow)
{
	m_scrollY = 0;
	bool sthChanged = OnVScroll(IDT_WORKSPACE_V_SCROLL, offset/m_coversXCount, FALSE/*redraw*/);

	if( selectOneInRow ) // only used by "goto random"
	{
		int randMax = m_coversXCount;
		if( randMax > m_allocatedCoverCount ) randMax = m_allocatedCoverCount;

		SjCol* currCover = m_allocatedCover[SjTools::Rand(randMax)];
		if( currCover )
		{
			g_mainFrame->m_columnMixer.SelectAll(false);
			SelectAllRows(currCover);
		}
	}

	SetVScrollInfo();
	m_window->Refresh();
	m_window->Update();
	return sthChanged;
}
Example #6
0
bool SjCoverBrowser::OnVScroll(int nScrollCode, int nPos, bool redraw)
{
	wxASSERT( nScrollCode == IDT_WORKSPACE_V_SCROLL
	          || nScrollCode == IDT_WORKSPACE_LINE_UP
	          || nScrollCode == IDT_WORKSPACE_LINE_DOWN
	          || nScrollCode == IDT_WORKSPACE_PAGE_UP
	          || nScrollCode == IDT_WORKSPACE_PAGE_DOWN
	          || nScrollCode == IDT_WORKSPACE_HOME
	          || nScrollCode == IDT_WORKSPACE_END );

	long newIndex = m_applRowIndex, oldIndex, abs;
	bool canUseScroll;

	if( nScrollCode == IDT_WORKSPACE_HOME )
	{
		newIndex = 0;
	}
	else if( nScrollCode == IDT_WORKSPACE_END )
	{
		newIndex = m_applRowCount; // sth. substracted below
	}
	else if( nScrollCode == IDT_WORKSPACE_LINE_UP )
	{
		newIndex--;
	}
	else if( nScrollCode == IDT_WORKSPACE_LINE_DOWN )
	{
		newIndex++;
	}
	else if( nScrollCode == IDT_WORKSPACE_PAGE_UP )
	{
		newIndex -= m_coversYCount;
	}
	else if( nScrollCode == IDT_WORKSPACE_PAGE_DOWN )
	{
		newIndex += m_coversYCount;
	}
	else if( nScrollCode == IDT_WORKSPACE_V_SCROLL )
	{
		newIndex = nPos;
	}

	if( newIndex > m_applRowCount-m_coversYCount ) {
		newIndex = m_applRowCount-m_coversYCount;
		// may get below zero, this is checked below
	}

	if( newIndex < 0 ) {
		newIndex = 0;
	}

	if( (newIndex != m_applRowIndex)
	        || (newIndex == 0 && m_scrollY != 0) )
	{
		oldIndex = m_applRowIndex;
		canUseScroll = TRUE;

		if( newIndex == 0 ) {
			m_scrollY = 0;
			canUseScroll = FALSE;
		}

		m_applRowIndex = newIndex;
		CalcPositions();
		SetVScrollInfo();

		abs = oldIndex - newIndex;
		if( abs < 0 )
		{
			abs*=-1;
		}

		if( abs > m_coversYCount )
		{
			canUseScroll = FALSE;
		}

		if( canUseScroll )
		{
			if( g_mainFrame->m_imgThread->HasWaitingImages() )
			{
				canUseScroll = FALSE;
			}
		}

		if( redraw )
		{
			if( canUseScroll )
			{
				wxRect scrollRect = SCROLL_RECT;
				m_window->ScrollWindow(0, (oldIndex - newIndex)*(m_coverNTitleHeight + SPACE_TOP), &scrollRect);

				m_window->Update();
			}
			else
			{
				m_window->Refresh();
			}

			return true;
		}
	}

	return false;
}
Example #7
0
void SjCoverBrowser::OnMouseMotion(wxMouseEvent& event)
{
	if( !m_window->HasCapture() ) return;

	long    hDifference, vDifference;

	long    oldRowIndex, oldScrollY;

	long    xPos = event.GetX(); /* client coordinates */
	long    yPos = event.GetY(); /* client coordinates */

	// start dragscroll or object dragging?
	if( m_window->m_mouseAction == SJ_ACTION_NONE )
	{
		hDifference = xPos - m_dragStartX;
		vDifference = yPos - m_dragStartY;
		if( hDifference >  DRAGSCROLL_DELTA
		        || hDifference < -DRAGSCROLL_DELTA
		        || vDifference >  DRAGSCROLL_DELTA
		        || vDifference < -DRAGSCROLL_DELTA )
		{
			#ifdef USE_COVER_DND
			SjCol* cover;
			if( g_accelModule->m_selDragNDrop
			 && (cover=FindCover(m_dragStartX, m_dragStartY))!=NULL
			 && cover->IsAnyRowSelected() )
			{
				// do object dragging
				m_window->m_dragUrls.Clear();
				g_mainFrame->m_columnMixer.GetSelectedUrls(m_window->m_dragUrls);
				if( g_accelModule->m_flags&SJ_ACCEL_USEDNDIMAGES )
				{
					g_mainFrame->m_dragImage = m_window->GetCoverDragNDropBitmap(cover, g_mainFrame->m_dragRect);
					if( g_mainFrame->m_dragImage )
					{
						g_mainFrame->m_dragHotspot.x = xPos - cover->m_textlLeft;
						g_mainFrame->m_dragHotspot.y = yPos - cover->m_top + m_scrollY;
					}
				}
				if( g_mainFrame->DragNDrop(SJ_DND_ENTER, m_window, event.GetPosition(), NULL, &m_window->m_dragUrls) )
				{
					m_window->m_mouseAction = SJ_ACTION_DRAGNDROP;
				}
			}
			else
			#endif
			if( g_accelModule->m_flags&SJ_ACCEL_CONTENT_DRAG
			 && m_applRowCount )
			{
				// start dragscroll
				m_window->m_mouseAction = SJ_ACTION_DRAGSCROLL;
				m_dragscrollCurrY       = yPos;
			}
		}
	}

	// in drag'n'drop?
	#ifdef USE_COVER_DND
	if( m_window->m_mouseAction == SJ_ACTION_DRAGNDROP )
	{
		if( !g_mainFrame->DragNDrop(SJ_DND_MOVE, m_window, event.GetPosition(), NULL, &m_window->m_dragUrls) )
		{
			m_window->m_mouseAction = SJ_ACTION_NONE;
		}
	}
	#endif

	// in dragscroll?
	if( m_window->m_mouseAction == SJ_ACTION_DRAGSCROLL )
	{
		oldScrollY  = m_scrollY;
		oldRowIndex = m_applRowIndex;

		// horizontal scrolling
		vDifference = yPos - m_dragscrollCurrY;
		m_dragscrollCurrY = yPos;
		if( vDifference )
		{
			if( vDifference > m_coverNTitleHeight ) {
				vDifference = m_coverNTitleHeight;
			}
			else if( vDifference < 0 - m_coverNTitleHeight ) {
				vDifference = 0 - m_coverNTitleHeight;
			}

			m_scrollY -= vDifference;

			if( m_scrollY < 0 )
			{
				// decrease application column position if possible
				if( m_applRowIndex > 0 )
				{
					m_scrollY += m_coverNTitleHeight + SPACE_TOP;
					m_applRowIndex--;
					CalcPositions();
					SetVScrollInfo();
				}
				else
				{
					m_scrollY = 0;
				}
			}
			else if( m_scrollY >= m_coverNTitleHeight + SPACE_TOP )
			{
				// increase application column position if possible
				if( m_applRowIndex < m_applRowCount-m_coversYCount )
				{
					m_scrollY -= m_coverNTitleHeight + SPACE_TOP;
					m_applRowIndex++;
					CalcPositions();
					SetVScrollInfo();
				}
				else
				{
					m_scrollY = m_coverNTitleHeight + SPACE_TOP;
				}
			}
			else if( (m_allocatedCoverCount/m_coversXCount)*(m_coverNTitleHeight+SPACE_TOP)-m_scrollY < m_window->m_clientH )
			{
				// a new column will fit on the right
				if( m_applRowIndex+m_coversYCount < m_applRowCount )
				{
					CalcPositions();
				}
			}
		}

		// update window
		if( vDifference )
		{
			if( g_mainFrame->m_imgThread->HasWaitingImages() )
			{
				// if there are waiting images, invalidate the whole rectangle as
				// some areas are no yet okay
				m_window->Refresh();
			}
			else
			{
				vDifference =
				    (oldRowIndex*(m_coverNTitleHeight+SPACE_TOP) + oldScrollY)
				    -   (m_applRowIndex*(m_coverNTitleHeight+SPACE_TOP) + m_scrollY);

				wxRect scrollRect = SCROLL_RECT;
				m_window->ScrollWindow(0, vDifference, &scrollRect);

				m_window->Update();
			}
		}
	}
}
Example #8
0
void SjCoverBrowser::OnSize(wxSizeEvent& event)
{
	CalcPositions();
	SetVScrollInfo();
}