/* * Kivio - Visual Modelling and Flowcharting * Copyright (C) 2000-2003 theKompany.com & Dave Marotti, * Peter Simonsson * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "tool_zoom.h" #include "kivio_view.h" #include "kivio_page.h" #include "kivio_canvas.h" #include "kivio_factory.h" #include <tdeaction.h> #include <kiconloader.h> #include <tdelocale.h> #include <tdepopupmenu.h> #include <tdetoolbar.h> #include <KoMainWindow.h> #include <kdebug.h> #include <KoZoomHandler.h> #include <KoPoint.h> #include <kstdaction.h> #include <KoZoomAction.h> #include <tqapplication.h> #include <tqcursor.h> ZoomTool::ZoomTool(KivioView* parent) : Kivio::MouseTool(parent, "Zoom Mouse Tool") { m_zoomAction = new TDERadioAction(i18n("&Zoom"), "viewmag", CTRL + ALT + Key_Z, actionCollection(), "zoom"); m_zoomAction->setWhatsThis(i18n("By pressing this button you can zoom in on a specific area.")); m_panAction = new TDERadioAction(i18n("&Pan Document"), "kivio_zoom_hand", CTRL + ALT + Key_H, actionCollection(), "pan"); m_panAction->setWhatsThis(i18n("You can drag the document by using the mouse.")); m_zoomAction->setExclusiveGroup("zoomAction"); m_panAction->setExclusiveGroup("zoomAction"); connect(m_zoomAction,TQT_SIGNAL(activated()),TQT_SLOT(zoomActivated())); connect(m_panAction,TQT_SIGNAL(activated()),TQT_SLOT(handActivated())); connect(m_zoomAction, TQT_SIGNAL(toggled(bool)), this, TQT_SLOT(setActivated(bool))); connect(m_panAction, TQT_SIGNAL(toggled(bool)), this, TQT_SLOT(setActivated(bool))); KoZoomAction* viewZoom = new KoZoomAction(i18n("Zoom &Level"), "viewmag", 0, actionCollection(), "viewZoom" ); viewZoom->setWhatsThis(i18n("This allows you to zoom in or out of a document. You can either choose one of the predefined zoomfactors or enter a new zoomfactor (in percent).")); connect(viewZoom, TQT_SIGNAL(zoomChanged(const TQString&)), parent, TQT_SLOT(viewZoom(const TQString&))); connect(parent, TQT_SIGNAL(zoomChanged(int)), viewZoom, TQT_SLOT(setZoom(int))); m_pPlus = KStdAction::zoomIn(this, TQT_SLOT(zoomPlus()), actionCollection(), "zoomPlus"); m_pPlus->setWhatsThis(i18n("You can zoom in on the document by pressing this button.")); m_pMinus = KStdAction::zoomOut(this, TQT_SLOT(zoomMinus()), actionCollection(), "zoomMinus"); m_pMinus->setWhatsThis(i18n("By pressing this button you can zoom out of the document.")); m_pZoomWidth = new TDEAction( i18n("Zoom Width"), "kivio_zoom_width", SHIFT+Key_F4, actionCollection(), "zoomWidth" ); m_pZoomWidth->setWhatsThis(i18n("You can zoom the document that it fits into the window width.")); connect(m_pZoomWidth,TQT_SIGNAL(activated()),TQT_SLOT(zoomWidth())); m_pZoomHeight = new TDEAction( i18n("Zoom Height"), "kivio_zoom_height", SHIFT+Key_F5, actionCollection(), "zoomHeight" ); m_pZoomHeight->setWhatsThis(i18n("You can zoom the document that it fits into the window height.")); connect(m_pZoomHeight,TQT_SIGNAL(activated()),TQT_SLOT(zoomHeight())); m_pZoomPage = new TDEAction( i18n("Zoom Page"), "kivio_zoom_page", SHIFT+Key_F6, actionCollection(), "zoomPage" ); m_pZoomPage->setWhatsThis(i18n("The Zoom Page button shows the entire page.")); connect(m_pZoomPage,TQT_SIGNAL(activated()),TQT_SLOT(zoomPage())); m_pZoomSelected = new TDEAction( i18n("Zoom Selected"), "kivio_zoom_selected", CTRL+Key_Y, actionCollection(), "zoomSelected" ); m_pZoomSelected->setWhatsThis(i18n("By pressing this button you zoom in on the document, so that all <b>selected</b> objects are visible.")); connect(m_pZoomSelected,TQT_SIGNAL(activated()),TQT_SLOT(zoomSelected())); m_pZoomAllObjects = new TDEAction( i18n("Zoom All Objects"), "kivio_zoom_allobject", 0, actionCollection(), "zoomAllObjects" ); m_pZoomAllObjects->setWhatsThis(i18n("You are able to zoom in on the document, so that all objects are visible by pressing this button.")); connect(m_pZoomAllObjects,TQT_SIGNAL(activated()),TQT_SLOT(zoomAllobjects())); TQPixmap pix; pix = BarIcon("kivio_zoom_plus",KivioFactory::global()); m_pPlusCursor = new TQCursor(pix,pix.width()/2,pix.height()/2); pix = BarIcon("kivio_zoom_minus",KivioFactory::global()); m_pMinusCursor = new TQCursor(pix,pix.width()/2,pix.height()/2); pix = BarIcon("kivio_zoom_hand",KivioFactory::global()); m_handCursor = new TQCursor(pix,pix.width()/2,pix.height()/2); m_pMenu = 0; } ZoomTool::~ZoomTool() { delete m_pPlusCursor; delete m_pMinusCursor; delete m_handCursor; } bool ZoomTool::processEvent(TQEvent* e) { KivioCanvas* canvas = view()->canvasWidget(); if(!m_bHandMode) { switch(e->type()) { case TQEvent::KeyPress: if (!m_bLockKeyboard && (TQT_TQKEYEVENT(e)->key() == Key_Shift)) { m_pCurrent = m_pMinus; canvas->setCursor(*m_pMinusCursor); return true; } break; case TQEvent::KeyRelease: if (!m_bLockKeyboard && (TQT_TQKEYEVENT(e)->key() == Key_Shift)) { m_pCurrent = m_pPlus; canvas->setCursor(*m_pPlusCursor); return true; } break; case TQEvent::MouseButtonPress: { TQMouseEvent* me = TQT_TQMOUSEEVENT(e); if(me->button() == Qt::LeftButton) { if(m_pCurrent == m_pMinus) { m_pCurrent->activate(); } else { m_bLockKeyboard = true; m_bDrawRubber = true; canvas->startRectDraw(me->pos(), KivioCanvas::Rubber); } } else { showPopupMenu(me->globalPos()); } return true; break; } case TQEvent::MouseButtonRelease: if(m_pCurrent == m_pPlus && m_bDrawRubber) { canvas->endRectDraw(); m_bDrawRubber = false; m_bLockKeyboard = false; zoomRect(canvas->rect()); return true; } break; case TQEvent::MouseMove: if (m_bDrawRubber) { canvas->continueRectDraw(TQT_TQMOUSEEVENT(e)->pos(), KivioCanvas::Rubber); return true; } break; default: break; } } else { switch(e->type()) { case TQEvent::MouseButtonPress: isHandMousePressed = true; mousePos = TQT_TQMOUSEEVENT(e)->pos(); return true; break; case TQEvent::MouseButtonRelease: isHandMousePressed = false; return true; break; case TQEvent::MouseMove: if (isHandMousePressed) { canvas->setUpdatesEnabled(false); TQPoint newPos = TQT_TQMOUSEEVENT(e)->pos(); mousePos -= newPos; canvas->scrollDx(-mousePos.x()); canvas->scrollDy(-mousePos.y()); mousePos = newPos; canvas->setUpdatesEnabled(true); return true; } break; default: break; } } return false; } void ZoomTool::setActivated(bool a) { if(a) { m_pCurrent = m_pPlus; emit activated(this); } else { kdDebug(43000) << "ZoomTool DeActivate" << endl; m_pCurrent = 0L; m_zoomAction->setChecked(false); m_panAction->setChecked(false); view()->setStatusBarInfo(""); if (!view()->canvasWidget()->isUpdatesEnabled()) { view()->canvasWidget()->setUpdatesEnabled(true); } } } void ZoomTool::zoomActivated() { view()->canvasWidget()->setCursor(*m_pPlusCursor); m_bHandMode = false; m_bDrawRubber = false; m_bLockKeyboard = false; m_zoomAction->setChecked(true); m_panAction->setChecked(false); view()->setStatusBarInfo(i18n("Hold Shift to zoom out.")); } void ZoomTool::handActivated() { view()->canvasWidget()->setCursor(*m_handCursor); m_bHandMode = true; isHandMousePressed = false; m_zoomAction->setChecked(false); m_panAction->setChecked(true); } void ZoomTool::zoomPlus() { KivioCanvas* canvas = view()->canvasWidget(); canvas->zoomIn(TQPoint(canvas->width()/2, canvas->height()/2)); if(view()->zoomHandler()->zoom() >= 2000) { m_pPlus->setEnabled(false); m_pMinus->setEnabled(true); } else { m_pPlus->setEnabled(true); m_pMinus->setEnabled(true); } } void ZoomTool::zoomMinus() { KivioCanvas* canvas = view()->canvasWidget(); canvas->zoomOut(TQPoint(canvas->width()/2, canvas->height()/2)); if(view()->zoomHandler()->zoom() <= 25) { m_pMinus->setEnabled(false); m_pPlus->setEnabled(true); } else { m_pMinus->setEnabled(true); m_pPlus->setEnabled(true); } } void ZoomTool::zoomWidth() { KivioCanvas* canvas = view()->canvasWidget(); KoZoomHandler zoom; zoom.setZoomAndResolution(100, KoGlobal::dpiX(), KoGlobal::dpiY()); int cw = TQMAX(10,canvas->width()-20); KoPageLayout pl = canvas->activePage()->paperLayout(); float w = zoom.zoomItX(pl.ptWidth); float z = cw/w; canvas->setUpdatesEnabled(false); view()->viewZoom(tqRound(z * 100)); canvas->setUpdatesEnabled(true); } void ZoomTool::zoomHeight() { KivioCanvas* canvas = view()->canvasWidget(); KoZoomHandler zoom; zoom.setZoomAndResolution(100, KoGlobal::dpiX(), KoGlobal::dpiY()); int ch = TQMAX(10,canvas->height()-20); KoPageLayout pl = canvas->activePage()->paperLayout(); float h = zoom.zoomItY(pl.ptHeight); float zh = ch/h; canvas->setUpdatesEnabled(false); view()->viewZoom(tqRound(zh * 100)); canvas->setUpdatesEnabled(true); } void ZoomTool::zoomPage() { KivioCanvas* canvas = view()->canvasWidget(); KoZoomHandler zoom; zoom.setZoomAndResolution(100, KoGlobal::dpiX(), KoGlobal::dpiY()); int cw = TQMAX(10,canvas->width()-20); int ch = TQMAX(10,canvas->height()-20); KoPageLayout pl = canvas->activePage()->paperLayout(); float w = zoom.zoomItX(pl.ptWidth); float h = zoom.zoomItY(pl.ptHeight); float z = TQMIN(cw/w,ch/h); canvas->setUpdatesEnabled(false); view()->viewZoom(tqRound(z * 100)); canvas->setUpdatesEnabled(true); } void ZoomTool::showPopupMenu(const TQPoint& p ) { if(!m_pMenu) { m_pMenu = static_cast<TDEPopupMenu*>(factory()->container("ZoomPopup", this)); } if(m_pMenu) { m_pMenu->popup(p); } else { kdDebug(43000) << "What no popup! *ARGH*!" << endl; } } void ZoomTool::zoomSelected() { KivioCanvas* canvas = view()->canvasWidget(); KoRect r = canvas->activePage()->getRectForAllSelectedStencils(); if (!r.isNull() && r.isValid()) { canvas->setVisibleArea(r); } } void ZoomTool::zoomAllobjects() { KivioCanvas* canvas = view()->canvasWidget(); KoRect r = canvas->activePage()->getRectForAllStencils(); if (!r.isNull() && r.isValid()) { canvas->setVisibleArea(r); } } void ZoomTool::zoomRect(TQRect r) { KivioCanvas* canvas = view()->canvasWidget(); if (r.isEmpty()) { canvas->zoomIn(r.topLeft()); return; } KoPoint p0 = canvas->mapFromScreen(r.topLeft()); canvas->setVisibleArea(KoRect(p0.x(), p0.y(), view()->zoomHandler() ->unzoomItX(r.width()), view()->zoomHandler()->unzoomItY(r.height()))); } #include "tool_zoom.moc"