// 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); }
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; }
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(); } } }
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; }
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; }
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; }
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(); } } } }
void SjCoverBrowser::OnSize(wxSizeEvent& event) { CalcPositions(); SetVScrollInfo(); }