18#include "KWDocument.h"
19#include "KWFrameViewManager.h"
20#include <KWFrameView.h>
22#include <KWFrameSet.h>
28#include "tqpopupmenu.h"
31KWFrameViewManager::KWFrameViewManager() : TQObject() {
32 setName(
"KWFrameViewManager");
33 m_queueRequested =
false;
34 m_blockEvents =
false;
37KWFrameViewManager::KWFrameViewManager(KWDocument *doc) {
38 m_queueRequested =
false;
40 TQPtrListIterator<KWFrameSet> frameSets = doc->framesetsIterator();
41 while(frameSets.current()) {
45 m_blockEvents =
false;
48 recalculateFrameCache();
51KWFrameViewManager::~KWFrameViewManager() {
52 TQValueListIterator<FrameEvent *> events = m_frameEvents.begin();
53 while(events != m_frameEvents.end()) {
59void KWFrameViewManager::addKWFramesListener(KWFramesListener *listener) {
60 m_framesListener.append(listener);
62void KWFrameViewManager::removeKWFramesListener(KWFramesListener *listener) {
63 m_framesListener.remove(listener);
68 m_frameEvents.append(
new FrameEvent(FrameEvent::FrameSetAdded, fs));
73 while(frames.current()) {
82 m_frameEvents.append(
new FrameEvent(FrameEvent::FrameSetRemoved, fs));
87 while(frames.current()) {
96 m_frameEvents.append(
new FrameEvent(FrameEvent::FrameAdded, f));
102 m_frameEvents.append(
new FrameEvent(FrameEvent::FrameRemoved, f));
103 TQValueListIterator<KWFrameView *> frames = m_frames.begin();
104 while(frames != m_frames.end()) {
106 if(fv->
frame() == f) {
108 m_frameEvents.append(
new FrameEvent(FrameEvent::FrameSelectionChanged));
109 m_frames.remove(frames);
118 Q_UNUSED(previousYPosition);
120 m_frameEvents.append(
new FrameEvent(FrameEvent::FrameMoved, f));
127 m_frameEvents.append(
new FrameEvent(FrameEvent::FrameResized, f));
133 m_frameEvents.append(
new FrameEvent(FrameEvent::FrameSelectionChanged));
140 m_frameEvents.append(
new FrameEvent(FrameEvent::FrameSetRenamed, fs));
145 if(m_queueRequested && !m_blockEvents)
147 m_queueRequested =
true;
148 TQTimer::singleShot ( 0,
this, TQ_SLOT(
fireEvents()) );
152 m_queueRequested =
false;
153 if(m_frameEvents.isEmpty())
155 recalculateFrameCache();
157 TQValueList<FrameEvent *> copy(m_frameEvents);
158 m_frameEvents.clear();
160 TQValueList<KWFrame*> resizedFrames;
161 TQValueList<KWFrame*> movedFrames;
162 TQValueList<KWFramesListener *> listenersCopy(m_framesListener);
163 bool selectionChangedFired=
false;
165 TQValueListIterator<FrameEvent *> events = copy.begin();
166 while(events != copy.end()) {
167 FrameEvent *
event = *events;
170 if(!selectionChangedFired && event->m_action == FrameEvent::FrameSelectionChanged) {
172 selectionChangedFired =
true;
173 }
else if(event->m_action == FrameEvent::FrameSetRenamed) {
174 TQPtrListIterator<KWFrame> frames =
event->m_frameSet->frameIterator();
175 for(;frames.current();++frames) {
181 }
else if(event->m_action == FrameEvent::FrameResized) {
182 resizedFrames.append(event->m_frame);
183 }
else if(event->m_action == FrameEvent::FrameMoved) {
184 movedFrames.append(event->m_frame);
188 TQValueListIterator<KWFramesListener *> listeners = listenersCopy.begin();
189 while(listeners != listenersCopy.end()) {
190 if(event->m_action == FrameEvent::FrameRemoved)
191 (*listeners)->frameRemoved(event->m_frame);
192 else if(event->m_action == FrameEvent::FrameAdded)
193 (*listeners)->frameAdded(event->m_frame);
194 else if(event->m_action == FrameEvent::FrameSetRemoved)
195 (*listeners)->frameSetRemoved(event->m_frameSet);
196 else if(event->m_action == FrameEvent::FrameSetAdded)
197 (*listeners)->frameSetAdded(event->m_frameSet);
202 events = copy.remove(events);
204 if(resizedFrames.count() > 0)
206 if(movedFrames.count() > 0)
210void KWFrameViewManager::recalculateFrameCache() {
213 kdDebug(31001) <<
"recalculateFrameCache " << m_frames.count() <<
" frames are currently registred" << endl;
217 TQValueVector<KWFrameView*> framesThatAreHit = framesAt(point, borderOnly);
218 bool foundCycleFrame =
false;
219 TQValueVector<KWFrameView*>::iterator sortedFrames = framesThatAreHit.begin();
220 while(sortedFrames != framesThatAreHit.end()) {
221 if(selected == nextUnselected) {
222 if((*sortedFrames)->selected() )
223 foundCycleFrame =
true;
224 else if(foundCycleFrame && !(*sortedFrames)->selected() )
225 return *sortedFrames;
227 else if(selected == frameOnTop)
228 return *sortedFrames;
230 if((*sortedFrames)->selected() == (selected == KWFrameViewManager::selected ))
231 return *sortedFrames;
235 if(selected == nextUnselected && framesThatAreHit.count() > 0)
236 return framesThatAreHit[0];
240TQValueVector<KWFrameView*> KWFrameViewManager::framesAt(
const KoPoint &point,
bool borderOnly)
const {
241 TQValueVector<KWFrameView*> framesThatAreHit;
243 for(TQValueListConstIterator<KWFrameView*> frames = m_frames.begin();
244 frames != m_frames.end(); ++frames) {
245 if(! (*frames)->frame()->frameSet()->isVisible())
247 if(borderOnly && (*frames)->isBorderHit(point) ||
248 !borderOnly && (*frames)->contains(point))
249 framesThatAreHit.append(*frames);
252 std::sort(framesThatAreHit.begin(), framesThatAreHit.end(), compareFrameViewZOrder);
253 return framesThatAreHit;
258 TQValueListConstIterator<KWFrameView*> frames = m_frames.begin();
259 while(frames != m_frames.end()) {
260 if((*frames)->frame() == frame)
268 return f1->
frame()->zOrder() >= f2->
frame()->zOrder();
273 TQValueVector<KWFrameView*> framesThatAreHit = framesAt(point);
274 TQValueVector<KWFrameView*>::iterator sortedFrames = framesThatAreHit.begin();
275 MouseMeaning meaning;
276 while(sortedFrames != framesThatAreHit.end()) {
277 meaning = (*sortedFrames)->mouseMeaning(point, keyState);
278 if(meaning != MEANING_NONE) {
279 view = (*sortedFrames);
291 return TQt::ibeamCursor;
292 case MEANING_MOUSE_INSIDE:
294 case MEANING_MOUSE_INSIDE_TEXT:
295 return TQt::ibeamCursor;
296 case MEANING_MOUSE_OVER_LINK:
297 return TQt::PointingHandCursor;
298 case MEANING_MOUSE_OVER_FOOTNOTE:
299 return TQt::PointingHandCursor;
300 case MEANING_MOUSE_MOVE:
301 return TQt::sizeAllCursor;
302 case MEANING_MOUSE_SELECT:
303 return KCursor::handCursor();
304 case MEANING_ACTIVATE_PART:
305 return KCursor::handCursor();
306 case MEANING_TOPLEFT:
307 case MEANING_BOTTOMRIGHT:
308 return TQt::sizeFDiagCursor;
311 return TQt::sizeHorCursor;
312 case MEANING_BOTTOMLEFT:
313 case MEANING_TOPRIGHT:
314 return TQt::sizeBDiagCursor;
317 if ( frameSet->isProtectSize() || frameSet->isMainFrameset())
318 return TQt::forbiddenCursor;
319 return TQt::sizeVerCursor;
320 case MEANING_RESIZE_COLUMN:
321 return TQt::splitHCursor;
322 case MEANING_RESIZE_ROW:
323 return TQt::splitVCursor;
324 case MEANING_SELECT_RANGE:
325 case MEANING_SELECT_COLUMN:
326 case MEANING_SELECT_ROW:
327 case MEANING_FORBIDDEN:
328 return KCursor::handCursor();
334 TQValueVector<KWFrameView*> framesThatAreHit = framesAt(point);
335 TQValueVector<KWFrameView*>::iterator sortedFrames = framesThatAreHit.begin();
336 while(sortedFrames != framesThatAreHit.end()) {
337 MouseMeaning answer = (*sortedFrames)->mouseMeaning(point, keyState);
338 if(answer != MEANING_NONE) {
350 TQValueList<KWFrameView*>::const_iterator frames = m_frames.begin();
351 for(; frames != m_frames.end(); ++frames )
352 if( (*frames)->selected() )
358 TQValueList<KWFrameView*>::const_iterator frames = m_frames.begin();
359 for(; frames != m_frames.end(); ++frames )
360 if( (*frames)->selected() )
366 TQValueVector<KWFrameView*> framesThatAreHit = framesAt(point);
367 if(framesThatAreHit.count() == 0) {
368 view->popupMenu(
"action_popup")->popup(popupPoint);
371 if(keyState == TQt::ControlButton) {
373 framesThatAreHit[0]->showPopup(framesThatAreHit[0]->frame()->topLeft(),
view, popupPoint);
376 TQValueVector<KWFrameView*>::iterator iter = framesThatAreHit.begin();
377 while(iter != framesThatAreHit.end()) {
378 if( (*iter)->selected() && keyState == TQt::ControlButton ) {
379 (*iter)->showPopup(point,
view, popupPoint);
384 framesThatAreHit[0]->showPopup(point,
view, popupPoint);
389 bool multiSelect = mm == MEANING_MOUSE_SELECT || ( keyState & TQt::ControlButton );
391 if(leftClick && multiSelect)
395 if(toBeSelected == 0 || (keyState & TQt::ControlButton) == 0 || ( keyState & TQt::ShiftButton ) &&
396 !(leftClick && (mm == MEANING_TOPLEFT || mm == MEANING_TOPRIGHT || mm == MEANING_TOP ||
397 mm == MEANING_LEFT || mm == MEANING_RIGHT || mm == MEANING_MOUSE_MOVE ||
398 mm == MEANING_BOTTOMLEFT || mm == MEANING_BOTTOM || mm == MEANING_BOTTOMRIGHT))) {
400 for(TQValueListConstIterator<KWFrameView*> frames = m_frames.begin();
401 frames != m_frames.end(); ++frames) {
402 (*frames)->setSelected(
false);
405 if(toBeSelected == 0)
412KWFrameViewManager::FrameEvent::FrameEvent (ActionType action) {
415KWFrameViewManager::FrameEvent::FrameEvent (ActionType action, KWFrame *frame) {
419KWFrameViewManager::FrameEvent::FrameEvent (ActionType action, KWFrameSet *frameSet) {
421 m_frameSet = frameSet;
425#include "KWFrameViewManager.moc"
Class: KWFrameSet Base type, a frameset holds content as well as frames to show that content.
const TQPtrList< KWFrame > & frameIterator() const
Iterator over the child frames.
SelectionType
Used to change the behavior of view().
void slotFrameResized(KWFrame *f)
notify this slot if a Frame has been resized
KWFrameView * selectedFrame() const
Returns the first selected frame.
void showPopup(const KoPoint &point, KWView *view, int keyState, const TQPoint &popupPoint) const
Show a context-sensitive popup menu based on the location of 'point'.
void sigFrameMoved(const TQValueList< KWFrame * > &)
emitted after frames were moved
void slotFrameAdded(KWFrame *f)
notify this slot if a Frame has been created and should become visible.
void sigFrameSelectionChanged()
emitted after one or more incoming slotFrameSelectionChanged events.
MouseMeaning mouseMeaning(const KoPoint &point, int keyState) const
Return the MouseMeaning of what a click of the mouse would do at the point.
TQValueList< KWFrameView * > selectedFrames() const
Return all currently selected frames.
KWFrameView * view(const KoPoint &point, SelectionType select, bool borderOnly=false) const
Returns a frameView representing a frame positioned at point, or 0 when no match found.
void slotFrameSetRemoved(KWFrameSet *fs)
notify this slot if a FrameSet has been removed
void sigFrameSetRenamed()
emitted after a frameset that had at least one selected frame was renamed.
void slotFrameSetRenamed(KWFrameSet *fs)
notify this slot if a frameset was renamed
void selectFrames(const KoPoint &point, int keyState, bool leftClick)
Select frames based on a mouse click at point using keystate.
void slotFrameSetAdded(KWFrameSet *fs)
notify this slot if a FrameSet has been created and should become visible.
void sigFrameResized(const TQValueList< KWFrame * > &)
emitted after frames were resized
TQCursor mouseCursor(const KoPoint &point, int keyState) const
Similar to mouseMeaning(), but instead of returning the meaning this will return a mouse cursor to re...
void slotFrameMoved(KWFrame *f, double previousYPosition)
notify this slot if a Frame has been moved
virtual void requestFireEvents()
prepare or update the singleshot timer to fire events.
void fireEvents()
This method will propagate all the events saved up to the listeners.
void slotFrameRemoved(KWFrame *f)
notify this slot if a Frame has been removed
void slotFrameSelectionChanged()
notify this slot if one or more frames have been selected or unselected.
an instance of a KWFrameView represents the view in the MVC model of a frame; there can be multiple K...
void setSelected(bool selected, MouseMeaning selectPolicy=MEANING_MOUSE_SELECT)
Set the selected state of this frameView.
KWFrame * frame() const
returns the frame this frameView represents
bool selected() const
returns if this frameView is selected. A selected frame is shown differently on screen.
This class represents a single frame.