21#include <tqsplitter.h>
22#include <tqdockwindow.h>
23#include <tqdockarea.h>
26#include <tqobjectlist.h>
27#include <tqwidgetlist.h>
34#include <tdeapplication.h>
35#include <tdemainwindow.h>
44class KPanelKbdSizerIcon :
public TQCursor
47 KPanelKbdSizerIcon() :
48 TQCursor(TQt::SizeAllCursor),
51 currentPos = TQPoint(-1, -1);
59 void show(
const TQPoint p) {
61 originalPos = TQCursor::pos();
62 kapp->setOverrideCursor(*
this);
72 kapp->restoreOverrideCursor();
73 TQCursor::setPos(originalPos);
78 void setShape(
int shayp)
80 if (shayp != shape()) {
82 if (isActive) kapp->restoreOverrideCursor();
83 TQCursor::setShape((TQt::CursorShape)shayp);
84 if (isActive) kapp->setOverrideCursor(*
this);
89 TQSize delta(
const TQPoint p)
91 TQPoint d = p - currentPos;
92 return TQSize(d.x(), d.y());
97 TQSize delta() {
return delta(pos()); }
109class KKbdAccessExtensionsPrivate
112 KKbdAccessExtensionsPrivate() :
120 accessKeyLabels(0) {};
122 ~KKbdAccessExtensionsPrivate()
126 if (accessKeyLabels) {
127 accessKeyLabels->setAutoDelete(
false);
128 delete accessKeyLabels;
133 TDEAction* fwdAction;
134 TDEAction* revAction;
137 TDEAction* accessKeysAction;
148 KPanelKbdSizerIcon* icon;
154 TQPtrList<TQLabel>* accessKeyLabels;
157 TDEMainWindow* mainWindow;
161 TQObject(parent, name)
164 d =
new KKbdAccessExtensionsPrivate;
165 d->mainWindow = parent;
166 d->fwdAction =
new TDEAction(i18n(
"Resize Panel Forward"), TDEShortcut(
"F8"),
168 d->revAction =
new TDEAction(i18n(
"Resize Panel Reverse"), TDEShortcut(
"Shift+F8"),
170 d->accessKeysAction =
new TDEAction(i18n(
"Access Keys"), TDEShortcut(
"Alt+F8"),
173 d->fwdAction->setEnabled(
false);
174 d->revAction->setEnabled(
false);
175 d->accessKeysAction->setEnabled(
false);
176 d->icon =
new KPanelKbdSizerIcon();
177 kapp->installEventFilter(
this);
182 kapp->removeEventFilter(
this);
193 if ( e->type() == TQEvent::KeyPress ) {
199 TDEShortcut fwdSc = d->fwdAction->shortcut();
200 TDEShortcut revSc = d->revAction->shortcut();
201 TDEShortcut accessKeysSc = d->accessKeysAction->shortcut();
202 TQKeyEvent* kev =
dynamic_cast<TQKeyEvent *
>(e);
204 TDEShortcut sc = TDEShortcut(k);
206 if (!d->accessKeyLabels) {
217 if (k == KKey(Key_Escape))
224 if (sc == accessKeysSc && !d->panel) {
225 if (d->accessKeyLabels) {
226 delete d->accessKeyLabels;
227 d->accessKeyLabels = 0;
232 if (d->accessKeyLabels) {
233 if (k == KKey(Key_Escape)) {
234 delete d->accessKeyLabels;
235 d->accessKeyLabels = 0;
242 else if (d->icon->isActive && e->type() == TQEvent::MouseButtonPress) {
246 else if (d->accessKeyLabels && e->type() == TQEvent::MouseButtonPress) {
247 delete d->accessKeyLabels;
248 d->accessKeyLabels = 0;
257 else if (e->type() == TQEvent::MouseMove && d->icon->isActive && d->panel) {
259 TQMouseEvent* me =
dynamic_cast<TQMouseEvent *
>(e);
260 TQSize s = d->icon->delta();
268 else if (e->type() == TQEvent::Resize && d->panel && o == d->panel) {
277 TQWidgetList* allWidgets = kapp->allWidgets();
278 TQWidgetList* allPanels =
new TQWidgetList;
279 TQWidget* widget = allWidgets->first();
281 if (widget->isVisible()) {
282 if (::tqt_cast<TQSplitter*>( widget )) {
284 if (
dynamic_cast<TQSplitter *
>(widget)->sizes().count() >= 2)
285 allPanels->append(widget);
286 }
else if (::tqt_cast<TQDockWindow*>( widget )) {
287 if (
dynamic_cast<TQDockWindow *
>(widget)->isResizeEnabled()) {
289 allPanels->append(widget);
293 widget = allWidgets->next();
301 TQWidget* panel = d->panel;
306 if (::tqt_cast<TQSplitter*>( panel ))
307 advance = (d->handleNdx >=
dynamic_cast<TQSplitter *
>(panel)->sizes().count());
310 advance = (d->handleNdx > 2 || !
dynamic_cast<TQDockWindow *
>(panel)->area());
313 allWidgets->findRef(panel);
315 if (allWidgets->current()) panel = allWidgets->next();
322 panel = allWidgets->first();
335 TQWidget* panel = d->panel;
340 rewind = (d->handleNdx < 1);
343 allWidgets->findRef(panel);
345 if (allWidgets->current()) panel = allWidgets->prev();
348 if (::tqt_cast<TQSplitter*>( panel ))
349 d->handleNdx =
dynamic_cast<TQSplitter *
>(panel)->sizes().count() - 1;
351 if (
dynamic_cast<TQDockWindow *
>(panel)->area())
361 panel = allWidgets->last();
364 if (::tqt_cast<TQSplitter*>( panel ))
365 d->handleNdx =
dynamic_cast<TQSplitter *
>(panel)->sizes().count() - 1;
367 if (
dynamic_cast<TQDockWindow *
>(panel)->area())
391 if (!d->panel)
return;
394 if (::tqt_cast<TQSplitter*>( d->panel )) {
395 TQSplitter* splitter =
dynamic_cast<TQSplitter *
>(d->panel);
396 int handleNdx = d->handleNdx - 1;
397 TQValueList<int> sizes = splitter->sizes();
399 if (splitter->orientation() == TQt::Horizontal) {
400 d->icon->setShape(TQt::SizeHorCursor);
401 p.setX(sizes[handleNdx] + (splitter->handleWidth() / 2));
402 p.setY(splitter->height() / 2);
404 d->icon->setShape(TQt::SizeVerCursor);
405 p.setX(splitter->width() / 2);
406 p.setY(sizes[handleNdx] + (splitter->handleWidth() / 2));
409 p = splitter->mapToGlobal(p);
412 TQDockWindow* dockWindow =
dynamic_cast<TQDockWindow *
>(d->panel);
413 p = dockWindow->pos();
414 if (dockWindow->area()) {
416 p = dockWindow->parentWidget()->mapTo(dockWindow->topLevelWidget(), p);
419 if (d->handleNdx == 1) {
420 d->icon->setShape(TQt::SizeHorCursor);
421 if (dockWindow->area()->orientation() == TQt::Vertical) {
422 if (dockWindow->area()->handlePosition() == TQDockArea::Normal)
424 p.setX(p.x() + dockWindow->width());
428 p.setX(p.x() + dockWindow->width());
429 p.setY(p.y() + (dockWindow->height() / 2));
431 d->icon->setShape(TQt::SizeVerCursor);
432 p.setX(p.x() + (dockWindow->width() / 2));
433 if (dockWindow->area()->orientation() == TQt::Vertical)
435 p.setY(p.y() + dockWindow->height());
437 if (dockWindow->area()->handlePosition() == TQDockArea::Normal)
439 p.setY(p.y() + dockWindow->height());
443 p = dockWindow->topLevelWidget()->mapToGlobal(p);
445 d->icon->setShape(TQt::SizeAllCursor);
446 p = TQPoint(dockWindow->width() / 2, dockWindow->height() / 2);
447 p = dockWindow->mapToGlobal(p);
462 if (adj == 0)
return;
464 if (::tqt_cast<TQSplitter*>( d->panel )) {
465 TQSplitter* splitter =
dynamic_cast<TQSplitter *
>(d->panel);
466 int handleNdx = d->handleNdx - 1;
467 TQValueList<int> sizes = splitter->sizes();
469 sizes[handleNdx] = sizes[handleNdx] + adj;
471 splitter->setSizes(sizes);
472 TQApplication::postEvent(splitter,
new TQEvent(TQEvent::LayoutHint));
475 TQDockWindow* dockWindow =
dynamic_cast<TQDockWindow *
>(d->panel);
476 if (dockWindow->area()) {
478 TQSize fe = dockWindow->fixedExtent();
479 if (d->handleNdx == 1) {
482 if (dockWindow->area()->orientation() == TQt::Vertical &&
483 dockWindow->area()->handlePosition() == TQDockArea::Reverse) adj = -adj;
485 if (w < 0) w = dockWindow->width();
487 if (w > 0 ) dockWindow->setFixedExtentWidth(w);
491 if (dockWindow->area()->orientation() == TQt::Horizontal &&
492 dockWindow->area()->handlePosition() == TQDockArea::Reverse) adj = -adj;
494 if (h < 0) h = dockWindow->height();
496 if (h > 0) dockWindow->setFixedExtentHeight(h);
498 dockWindow->updateGeometry();
499 TQApplication::postEvent(dockWindow->area(),
new TQEvent(TQEvent::LayoutHint));
502 if (state == TQt::ShiftButton) {
503 TQSize s = dockWindow->size();
504 s.setWidth(s.width() + dx);
505 s.setHeight(s.height() + dy);
506 dockWindow->resize(s);
508 TQPoint p = dockWindow->pos();
520 if (!d->panel)
return;
525 case TQt::Key_Left: dx = -
stepSize;
break;
526 case TQt::Key_Right: dx =
stepSize;
break;
527 case TQt::Key_Up: dy = -
stepSize;
break;
528 case TQt::Key_Down: dy =
stepSize;
break;
529 case TQt::Key_Prior: dy = -5 *
stepSize;
break;
530 case TQt::Key_Next: dy = 5 *
stepSize;
break;
537 if (key == TQt::Key_Enter && ::tqt_cast<TQDockWindow*>( d->panel )) {
538 TQDockWindow* dockWindow =
dynamic_cast<TQDockWindow *
>(d->panel);
539 if (dockWindow->area())
540 dockWindow->undock();
551 TQString availableAccessKeys =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890";
552 TQPtrList<KXMLGUIClient> allClients = d->mainWindow->factory()->clients();
553 TQPtrListIterator<KXMLGUIClient> it( allClients );
555 while( (client=it.current()) !=0 )
559 for (
int j = 0; j < (int)actions.count(); j++) {
561 TDEShortcut sc = action->
shortcut();
562 for (
int i = 0; i < (int)sc.count(); i++) {
563 KKeySequence seq = sc.seq(i);
564 if (seq.count() == 1) {
565 TQString s = seq.toString();
566 if (availableAccessKeys.contains(s))
567 availableAccessKeys.remove(s);
574 TQWidgetList* allWidgets = kapp->allWidgets();
575 TQWidget* widget = allWidgets->first();
577 int maxAccessCount = availableAccessKeys.length();
579 TQPoint prevGlobalPos = TQPoint(-overlap, -overlap);
580 while (widget && (accessCount < maxAccessCount)) {
581 if (widget->isVisible() && widget->isFocusEnabled() ) {
582 TQRect r = widget->rect();
583 TQPoint p(r.x(), r.y());
585 TQPoint globalPos = widget->mapToGlobal(p);
586 TQPoint diffPos = globalPos - prevGlobalPos;
587 if (diffPos.manhattanLength() > overlap) {
589 TQLabel* lab=
new TQLabel(widget,
"", widget, 0, TQt::WDestructiveClose);
590 lab->setPalette(TQToolTip::palette());
591 lab->setLineWidth(2);
592 lab->setFrameStyle(TQFrame::Box | TQFrame::Plain);
596 if (!d->accessKeyLabels) {
597 d->accessKeyLabels =
new TQPtrList<TQLabel>;
598 d->accessKeyLabels->setAutoDelete(
true);
600 d->accessKeyLabels->append(lab);
601 prevGlobalPos = globalPos;
604 widget = allWidgets->next();
606 if (accessCount > 0) {
608 TQValueList<KSortedLabel> sortedLabels;
609 for (
int i = 0; i < accessCount; i++)
610 sortedLabels.append(
KSortedLabel(d->accessKeyLabels->at(i)));
611 qHeapSort( sortedLabels );
613 for (
int i = 0; i < accessCount; i++) {
614 TQLabel* lab = sortedLabels[i].label();
615 TQChar s = availableAccessKeys[i];
628 if (!d->accessKeyLabels)
return false;
630 if( ev->key() >= Key_A && ev->key() <= Key_Z )
631 c =
'A' + ev->key() - Key_A;
632 else if( ev->key() >= Key_0 && ev->key() <= Key_9 )
633 c =
'0' + ev->key() - Key_0;
637 if( ev->text().length() == 1 )
643 TQLabel* lab = d->accessKeyLabels->first();
645 if (lab->text() == c) {
646 lab->buddy()->setFocus();
647 delete d->accessKeyLabels;
648 d->accessKeyLabels = 0;
651 lab = d->accessKeyLabels->next();
656KSortedLabel::KSortedLabel(TQLabel* l) :
659KSortedLabel::KSortedLabel() :
664 TQPoint p1 = m_l->mapToGlobal(m_l->pos());
665 TQPoint p2 = l.label()->mapToGlobal(l.label()->pos());
666 return (p1.y() < p2.y() || (p1.y() == p2.y() && p1.x() < p2.x()));
void hideIcon()
Hides the sizer icon.
int stepSize() const
Returns number of pixels panel is sized for each arrow key pressed.
bool handleAccessKey(const TQKeyEvent *ev)
Handles an access keypress.
void nextHandle()
Advances to the next Panel handle.
void resizePanelFromKey(int key, int state)
Moves panel handle based on key pressed.
void prevHandle()
Moves to the previous Panel handle.
TQWidgetList * getAllPanels()
Retrieves a list of all Splitter and DockArea widgets in the application.
void setStepSize(int s)
Sets number of pixels panel is sized for each arrow key pressed.
void resizePanel(int dx, int dy, int state)
Moves panel handle based on deltaX and deltaY and state of keyboard modifier keys.
void exitSizing()
Exits Sizing mode.
void displayAccessKeys()
Displays the access keys.
void showIcon()
Displays the sizer icon.
bool eventFilter(TQObject *o, TQEvent *e)
Event filter installed on kapp object.
virtual ~KKbdAccessExtensions()
Destructor.
KKbdAccessExtensions(TDEMainWindow *parent, const char *name=0)
Constructor.
Provides a way to sort TQLabelss using a TQValueList based on their screen position.
virtual TDEActionCollection * actionCollection() const
virtual TDEActionPtrList actions(const TQString &group) const
virtual const TDEShortcut & shortcut() const
This file is part of the KDE/KOffice project.