LMMS
Loading...
Searching...
No Matches
juce_TableHeaderComponent.cpp
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 By using JUCE, you agree to the terms of both the JUCE 7 End-User License
11 Agreement and JUCE Privacy Policy.
12
13 End User License Agreement: www.juce.com/juce-7-licence
14 Privacy Policy: www.juce.com/juce-privacy-policy
15
16 Or: You may also use this code under the terms of the GPL v3 (see
17 www.gnu.org/licenses).
18
19 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
20 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
21 DISCLAIMED.
22
23 ==============================================================================
24*/
25
26namespace juce
27{
28
30{
31public:
33 {
34 image.duplicateIfShared();
35 image.multiplyAllAlphas (0.8f);
36 setAlwaysOnTop (true);
37 }
38
39 void paint (Graphics& g) override
40 {
41 g.drawImage (image, getLocalBounds().toFloat());
42 }
43
45
47};
48
49
50//==============================================================================
54
59
60//==============================================================================
62{
63 menuActive = hasMenu;
64}
65
67
68
69//==============================================================================
70int TableHeaderComponent::getNumColumns (const bool onlyCountVisibleColumns) const
71{
72 if (onlyCountVisibleColumns)
73 {
74 int num = 0;
75
76 for (auto* c : columns)
77 if (c->isVisible())
78 ++num;
79
80 return num;
81 }
82
83 return columns.size();
84}
85
87{
88 if (auto* ci = getInfoForId (columnId))
89 return ci->name;
90
91 return {};
92}
93
94void TableHeaderComponent::setColumnName (const int columnId, const String& newName)
95{
96 if (auto* ci = getInfoForId (columnId))
97 {
98 if (ci->name != newName)
99 {
100 ci->name = newName;
102 }
103 }
104}
105
107 int columnId,
108 int width,
109 int minimumWidth,
110 int maximumWidth,
111 int propertyFlags,
112 int insertIndex)
113{
114 // can't have a duplicate or zero ID!
115 jassert (columnId != 0 && getIndexOfColumnId (columnId, false) < 0);
116 jassert (width > 0);
117
118 auto ci = new ColumnInfo();
119 ci->name = columnName;
120 ci->id = columnId;
121 ci->width = width;
122 ci->lastDeliberateWidth = width;
123 ci->minimumWidth = minimumWidth;
124 ci->maximumWidth = maximumWidth >= 0 ? maximumWidth : std::numeric_limits<int>::max();
125 jassert (ci->maximumWidth >= ci->minimumWidth);
126 ci->propertyFlags = propertyFlags;
127
128 columns.insert (insertIndex, ci);
130}
131
132void TableHeaderComponent::removeColumn (const int columnIdToRemove)
133{
134 auto index = getIndexOfColumnId (columnIdToRemove, false);
135
136 if (index >= 0)
137 {
138 columns.remove (index);
139 sortChanged = true;
141 }
142}
143
145{
146 if (columns.size() > 0)
147 {
148 columns.clear();
150 }
151}
152
153void TableHeaderComponent::moveColumn (const int columnId, int newIndex)
154{
155 auto currentIndex = getIndexOfColumnId (columnId, false);
156 newIndex = visibleIndexToTotalIndex (newIndex);
157
158 if (columns[currentIndex] != nullptr && currentIndex != newIndex)
159 {
160 columns.move (currentIndex, newIndex);
162 }
163}
164
165int TableHeaderComponent::getColumnWidth (const int columnId) const
166{
167 if (auto* ci = getInfoForId (columnId))
168 return ci->width;
169
170 return 0;
171}
172
173void TableHeaderComponent::setColumnWidth (const int columnId, const int newWidth)
174{
175 if (auto* ci = getInfoForId (columnId))
176 {
177 const auto newWidthToUse = jlimit (ci->minimumWidth, ci->maximumWidth, newWidth);
178
179 if (ci->width != newWidthToUse)
180 {
181 auto numColumns = getNumColumns (true);
182
183 ci->lastDeliberateWidth = ci->width = newWidthToUse;
184
185 if (stretchToFit)
186 {
187 auto index = getIndexOfColumnId (columnId, true) + 1;
188
189 if (isPositiveAndBelow (index, numColumns))
190 {
191 auto x = getColumnPosition (index).getX();
192
193 if (lastDeliberateWidth == 0)
195
197 }
198 }
199
200 repaint();
201 columnsResized = true;
203 }
204 }
205}
206
207//==============================================================================
208int TableHeaderComponent::getIndexOfColumnId (const int columnId, const bool onlyCountVisibleColumns) const
209{
210 int n = 0;
211
212 for (auto* c : columns)
213 {
214 if ((! onlyCountVisibleColumns) || c->isVisible())
215 {
216 if (c->id == columnId)
217 return n;
218
219 ++n;
220 }
221 }
222
223 return -1;
224}
225
226int TableHeaderComponent::getColumnIdOfIndex (int index, const bool onlyCountVisibleColumns) const
227{
228 if (onlyCountVisibleColumns)
229 index = visibleIndexToTotalIndex (index);
230
231 if (auto* ci = columns [index])
232 return ci->id;
233
234 return 0;
235}
236
238{
239 int x = 0, width = 0, n = 0;
240
241 for (auto* c : columns)
242 {
243 x += width;
244
245 if (c->isVisible())
246 {
247 width = c->width;
248
249 if (n++ == index)
250 break;
251 }
252 else
253 {
254 width = 0;
255 }
256 }
257
258 return { x, 0, width, getHeight() };
259}
260
261int TableHeaderComponent::getColumnIdAtX (const int xToFind) const
262{
263 if (xToFind >= 0)
264 {
265 int x = 0;
266
267 for (auto* ci : columns)
268 {
269 if (ci->isVisible())
270 {
271 x += ci->width;
272
273 if (xToFind < x)
274 return ci->id;
275 }
276 }
277 }
278
279 return 0;
280}
281
283{
284 int w = 0;
285
286 for (auto* c : columns)
287 if (c->isVisible())
288 w += c->width;
289
290 return w;
291}
292
293void TableHeaderComponent::setStretchToFitActive (const bool shouldStretchToFit)
294{
295 stretchToFit = shouldStretchToFit;
297 resized();
298}
299
304
306{
307 if (stretchToFit && getWidth() > 0
309 {
310 lastDeliberateWidth = targetTotalWidth;
311 resizeColumnsToFit (0, targetTotalWidth);
312 }
313}
314
315void TableHeaderComponent::resizeColumnsToFit (int firstColumnIndex, int targetTotalWidth)
316{
317 targetTotalWidth = jmax (targetTotalWidth, 0);
319
320 for (int i = firstColumnIndex; i < columns.size(); ++i)
321 {
322 auto* ci = columns.getUnchecked(i);
323
324 if (ci->isVisible())
325 sor.addItem (ci->lastDeliberateWidth, ci->minimumWidth, ci->maximumWidth);
326 }
327
328 sor.resizeToFit (targetTotalWidth);
329 int visIndex = 0;
330
331 for (int i = firstColumnIndex; i < columns.size(); ++i)
332 {
333 auto* ci = columns.getUnchecked(i);
334
335 if (ci->isVisible())
336 {
337 auto newWidth = jlimit (ci->minimumWidth, ci->maximumWidth,
338 (int) std::floor (sor.getItemSize (visIndex++)));
339
340 if (newWidth != ci->width)
341 {
342 ci->width = newWidth;
343 repaint();
344 columnsResized = true;
346 }
347 }
348 }
349}
350
351void TableHeaderComponent::setColumnVisible (const int columnId, const bool shouldBeVisible)
352{
353 if (auto* ci = getInfoForId (columnId))
354 {
355 if (shouldBeVisible != ci->isVisible())
356 {
357 if (shouldBeVisible)
358 ci->propertyFlags |= visible;
359 else
360 ci->propertyFlags &= ~visible;
361
363 resized();
364 }
365 }
366}
367
368bool TableHeaderComponent::isColumnVisible (const int columnId) const
369{
370 if (auto* ci = getInfoForId (columnId))
371 return ci->isVisible();
372
373 return false;
374}
375
376//==============================================================================
377void TableHeaderComponent::setSortColumnId (const int columnId, const bool sortForwards)
378{
379 if (getSortColumnId() != columnId || isSortedForwards() != sortForwards)
380 {
381 for (auto* c : columns)
382 c->propertyFlags &= ~(sortedForwards | sortedBackwards);
383
384 if (auto* ci = getInfoForId (columnId))
385 ci->propertyFlags |= (sortForwards ? sortedForwards : sortedBackwards);
386
387 reSortTable();
388 }
389}
390
392{
393 for (auto* c : columns)
394 if ((c->propertyFlags & (sortedForwards | sortedBackwards)) != 0)
395 return c->id;
396
397 return 0;
398}
399
401{
402 for (auto* c : columns)
403 if ((c->propertyFlags & (sortedForwards | sortedBackwards)) != 0)
404 return (c->propertyFlags & sortedForwards) != 0;
405
406 return true;
407}
408
415
416//==============================================================================
418{
419 String s;
420
421 XmlElement doc ("TABLELAYOUT");
422
423 doc.setAttribute ("sortedCol", getSortColumnId());
424 doc.setAttribute ("sortForwards", isSortedForwards());
425
426 for (auto* ci : columns)
427 {
428 auto* e = doc.createNewChildElement ("COLUMN");
429 e->setAttribute ("id", ci->id);
430 e->setAttribute ("visible", ci->isVisible());
431 e->setAttribute ("width", ci->width);
432 }
433
434 return doc.toString (XmlElement::TextFormat().singleLine().withoutHeader());
435}
436
438{
439 if (auto storedXML = parseXMLIfTagMatches (storedVersion, "TABLELAYOUT"))
440 {
441 int index = 0;
442
443 for (auto* col : storedXML->getChildIterator())
444 {
445 auto tabId = col->getIntAttribute ("id");
446
447 if (auto* ci = getInfoForId (tabId))
448 {
449 columns.move (columns.indexOf (ci), index);
450 ci->width = col->getIntAttribute ("width");
451 setColumnVisible (tabId, col->getBoolAttribute ("visible"));
452 }
453
454 ++index;
455 }
456
457 columnsResized = true;
459
460 setSortColumnId (storedXML->getIntAttribute ("sortedCol"),
461 storedXML->getBoolAttribute ("sortForwards", true));
462 }
463}
464
465//==============================================================================
467{
468 listeners.addIfNotAlreadyThere (newListener);
469}
470
472{
473 listeners.removeFirstMatchingValue (listenerToRemove);
474}
475
476//==============================================================================
477void TableHeaderComponent::columnClicked (int columnId, const ModifierKeys& mods)
478{
479 if (auto* ci = getInfoForId (columnId))
480 if ((ci->propertyFlags & sortable) != 0 && ! mods.isPopupMenu())
481 setSortColumnId (columnId, (ci->propertyFlags & sortedForwards) == 0);
482}
483
484void TableHeaderComponent::addMenuItems (PopupMenu& menu, const int /*columnIdClicked*/)
485{
486 for (auto* ci : columns)
487 if ((ci->propertyFlags & appearsOnColumnMenu) != 0)
488 menu.addItem (ci->id, ci->name,
489 (ci->propertyFlags & (sortedForwards | sortedBackwards)) == 0,
490 isColumnVisible (ci->id));
491}
492
493void TableHeaderComponent::reactToMenuItem (const int menuReturnId, const int /*columnIdClicked*/)
494{
495 if (getIndexOfColumnId (menuReturnId, false) >= 0)
496 setColumnVisible (menuReturnId, ! isColumnVisible (menuReturnId));
497}
498
500{
501 auto& lf = getLookAndFeel();
502
503 lf.drawTableHeaderBackground (g, *this);
504
505 auto clip = g.getClipBounds();
506
507 int x = 0;
508
509 for (auto* ci : columns)
510 {
511 if (ci->isVisible())
512 {
513 if (x + ci->width > clip.getX()
514 && (ci->id != columnIdBeingDragged
515 || dragOverlayComp == nullptr
516 || ! dragOverlayComp->isVisible()))
517 {
519
520 g.setOrigin (x, 0);
521 g.reduceClipRegion (0, 0, ci->width, getHeight());
522
523 lf.drawTableHeaderColumn (g, *this, ci->name, ci->id, ci->width, getHeight(),
524 ci->id == columnIdUnderMouse,
526 ci->propertyFlags);
527 }
528
529 x += ci->width;
530
531 if (x >= clip.getRight())
532 break;
533 }
534 }
535}
536
540
542{
543 repaint();
546
547 if (columnIdUnderMouse != 0)
548 {
550
551 if (e.mods.isPopupMenu())
553 }
554
555 if (menuActive && e.mods.isPopupMenu())
557}
558
560{
561 if (columnIdBeingResized == 0
563 && e.mouseWasDraggedSinceMouseDown()
564 && ! e.mods.isPopupMenu())
565 {
566 dragOverlayComp.reset();
567
568 columnIdBeingResized = getResizeDraggerAt (e.getMouseDownX());
569
570 if (columnIdBeingResized != 0)
571 {
572 if (auto* ci = getInfoForId (columnIdBeingResized))
573 initialColumnWidth = ci->width;
574 else
576 }
577 else
578 {
579 beginDrag (e);
580 }
581 }
582
583 if (columnIdBeingResized != 0)
584 {
585 if (auto* ci = getInfoForId (columnIdBeingResized))
586 {
587 auto w = jlimit (ci->minimumWidth, ci->maximumWidth,
588 initialColumnWidth + e.getDistanceFromDragStartX());
589
590 if (stretchToFit)
591 {
592 // prevent us dragging a column too far right if we're in stretch-to-fit mode
593 int minWidthOnRight = 0;
594
595 for (int i = getIndexOfColumnId (columnIdBeingResized, false) + 1; i < columns.size(); ++i)
596 if (columns.getUnchecked (i)->isVisible())
597 minWidthOnRight += columns.getUnchecked (i)->minimumWidth;
598
600 w = jmax (ci->minimumWidth, jmin (w, lastDeliberateWidth - minWidthOnRight - currentPos.getX()));
601 }
602
604 }
605 }
606 else if (columnIdBeingDragged != 0)
607 {
608 if (e.y >= -50 && e.y < getHeight() + 50)
609 {
610 if (dragOverlayComp != nullptr)
611 {
612 dragOverlayComp->setVisible (true);
613 dragOverlayComp->setBounds (jlimit (0,
614 jmax (0, getTotalWidth() - dragOverlayComp->getWidth()),
616 0,
617 dragOverlayComp->getWidth(),
618 getHeight());
619
620 for (int i = columns.size(); --i >= 0;)
621 {
622 const int currentIndex = getIndexOfColumnId (columnIdBeingDragged, true);
623 int newIndex = currentIndex;
624
625 if (newIndex > 0)
626 {
627 // if the previous column isn't draggable, we can't move our column
628 // past it, because that'd change the undraggable column's position..
629 auto* previous = columns.getUnchecked (newIndex - 1);
630
631 if ((previous->propertyFlags & draggable) != 0)
632 {
633 auto leftOfPrevious = getColumnPosition (newIndex - 1).getX();
634 auto rightOfCurrent = getColumnPosition (newIndex).getRight();
635
636 if (std::abs (dragOverlayComp->getX() - leftOfPrevious)
637 < std::abs (dragOverlayComp->getRight() - rightOfCurrent))
638 {
639 --newIndex;
640 }
641 }
642 }
643
644 if (newIndex < columns.size() - 1)
645 {
646 // if the next column isn't draggable, we can't move our column
647 // past it, because that'd change the undraggable column's position..
648 auto* nextCol = columns.getUnchecked (newIndex + 1);
649
650 if ((nextCol->propertyFlags & draggable) != 0)
651 {
652 auto leftOfCurrent = getColumnPosition (newIndex).getX();
653 auto rightOfNext = getColumnPosition (newIndex + 1).getRight();
654
655 if (std::abs (dragOverlayComp->getX() - leftOfCurrent)
656 > std::abs (dragOverlayComp->getRight() - rightOfNext))
657 {
658 ++newIndex;
659 }
660 }
661 }
662
663 if (newIndex != currentIndex)
665 else
666 break;
667 }
668 }
669 }
670 else
671 {
673 }
674 }
675}
676
678{
679 if (columnIdBeingDragged == 0)
680 {
681 columnIdBeingDragged = getColumnIdAtX (e.getMouseDownX());
682
684
685 if (ci == nullptr || (ci->propertyFlags & draggable) == 0)
686 {
688 }
689 else
690 {
692
694 auto temp = columnIdBeingDragged;
696
697 dragOverlayComp.reset (new DragOverlayComp (createComponentSnapshot (columnRect, false, 2.0f)));
700
701 dragOverlayComp->setBounds (columnRect);
702
703 for (int i = listeners.size(); --i >= 0;)
704 {
705 listeners.getUnchecked(i)->tableColumnDraggingChanged (this, columnIdBeingDragged);
706 i = jmin (i, listeners.size() - 1);
707 }
708 }
709 }
710}
711
712void TableHeaderComponent::endDrag (const int finalIndex)
713{
714 if (columnIdBeingDragged != 0)
715 {
716 moveColumn (columnIdBeingDragged, finalIndex);
717
719 repaint();
720
721 for (int i = listeners.size(); --i >= 0;)
722 {
723 listeners.getUnchecked(i)->tableColumnDraggingChanged (this, 0);
724 i = jmin (i, listeners.size() - 1);
725 }
726 }
727}
728
730{
731 mouseDrag (e);
732
733 for (auto* c : columns)
734 if (c->isVisible())
735 c->lastDeliberateWidth = c->width;
736
738 repaint();
739
741
743
744 if (columnIdUnderMouse != 0 && ! (e.mouseWasDraggedSinceMouseDown() || e.mods.isPopupMenu()))
746
747 dragOverlayComp.reset();
748}
749
757
758//==============================================================================
763
765{
766 for (auto* c : columns)
767 if (c->id == id)
768 return c;
769
770 return nullptr;
771}
772
773int TableHeaderComponent::visibleIndexToTotalIndex (const int visibleIndex) const
774{
775 int n = 0;
776
777 for (int i = 0; i < columns.size(); ++i)
778 {
779 if (columns.getUnchecked(i)->isVisible())
780 {
781 if (n == visibleIndex)
782 return i;
783
784 ++n;
785 }
786 }
787
788 return -1;
789}
790
800
802{
803 const bool changed = columnsChanged || sortChanged;
804 const bool sized = columnsResized || changed;
805 const bool sorted = sortChanged;
806 columnsChanged = false;
807 columnsResized = false;
808 sortChanged = false;
809
810 if (sorted)
811 {
812 for (int i = listeners.size(); --i >= 0;)
813 {
814 listeners.getUnchecked(i)->tableSortOrderChanged (this);
815 i = jmin (i, listeners.size() - 1);
816 }
817 }
818
819 if (changed)
820 {
821 for (int i = listeners.size(); --i >= 0;)
822 {
823 listeners.getUnchecked(i)->tableColumnsChanged (this);
824 i = jmin (i, listeners.size() - 1);
825 }
826 }
827
828 if (sized)
829 {
830 for (int i = listeners.size(); --i >= 0;)
831 {
832 listeners.getUnchecked(i)->tableColumnsResized (this);
833 i = jmin (i, listeners.size() - 1);
834 }
835 }
836}
837
839{
840 if (isPositiveAndBelow (mouseX, getWidth()))
841 {
842 const int draggableDistance = 3;
843 int x = 0;
844
845 for (auto* ci : columns)
846 {
847 if (ci->isVisible())
848 {
849 if (std::abs (mouseX - (x + ci->width)) <= draggableDistance
850 && (ci->propertyFlags & resizable) != 0)
851 return ci->id;
852
853 x += ci->width;
854 }
855 }
856 }
857
858 return 0;
859}
860
862{
863 if (newCol != columnIdUnderMouse)
864 {
865 columnIdUnderMouse = newCol;
866 repaint();
867 }
868}
869
871{
872 setColumnUnderMouse (reallyContains (e.getPosition(), true) && getResizeDraggerAt (e.x) == 0
873 ? getColumnIdAtX (e.x) : 0);
874}
875
876static void tableHeaderMenuCallback (int result, TableHeaderComponent* tableHeader, int columnIdClicked)
877{
878 if (tableHeader != nullptr && result != 0)
879 tableHeader->reactToMenuItem (result, columnIdClicked);
880}
881
882void TableHeaderComponent::showColumnChooserMenu (const int columnIdClicked)
883{
884 PopupMenu m;
885 addMenuItems (m, columnIdClicked);
886
887 if (m.getNumItems() > 0)
888 {
889 m.setLookAndFeel (&getLookAndFeel());
890
891 m.showMenuAsync (PopupMenu::Options(),
893 }
894}
895
899
900//==============================================================================
901std::unique_ptr<AccessibilityHandler> TableHeaderComponent::createAccessibilityHandler()
902{
903 return std::make_unique<AccessibilityHandler> (*this, AccessibilityRole::tableHeader);
904}
905
906} // namespace juce
Type jmin(const Type a, const Type b)
Definition MathsFunctions.h:60
Type jmax(const Type a, const Type b)
Definition MathsFunctions.h:48
void triggerAsyncUpdate()
Definition juce_AsyncUpdater.cpp:62
bool isMouseButtonDown(bool includeChildren=false) const
Definition juce_Component.cpp:3177
virtual MouseCursor getMouseCursor()
Definition juce_Component.cpp:1870
Image createComponentSnapshot(Rectangle< int > areaToGrab, bool clipImageToComponentBounds=true, float scaleFactor=1.0f)
Definition juce_Component.cpp:2135
bool reallyContains(Point< int > localPoint, bool returnTrueIfWithinAChild)
Definition juce_Component.cpp:1454
int getHeight() const noexcept
Definition juce_Component.h:274
int getX() const noexcept
Definition juce_Component.h:259
void addAndMakeVisible(Component *child, int zOrder=-1)
Definition juce_Component.cpp:1554
void setAlwaysOnTop(bool shouldStayOnTop)
Definition juce_Component.cpp:1074
void repaint()
Definition juce_Component.cpp:1917
Component() noexcept
Definition juce_Component.cpp:517
Point< int > getMouseXYRelative() const
Definition juce_Component.cpp:3210
virtual void resized()
Definition juce_Component.cpp:2318
int getWidth() const noexcept
Definition juce_Component.h:271
LookAndFeel & getLookAndFeel() const noexcept
Definition juce_Component.cpp:2173
Rectangle< int > getLocalBounds() const noexcept
Definition juce_Component.cpp:2283
Definition juce_GraphicsContext.h:660
Definition juce_GraphicsContext.h:45
Definition juce_Image.h:58
static ModalComponentManager::Callback * forComponent(void(*functionToCall)(int, ComponentType *), ComponentType *component)
Definition juce_ModalComponentManager.h:276
Definition juce_ModifierKeys.h:41
bool isPopupMenu() const noexcept
Definition juce_ModifierKeys.h:78
Definition juce_MouseCursor.h:39
@ LeftRightResizeCursor
Definition juce_MouseCursor.h:59
Definition juce_MouseEvent.h:39
Definition juce_PopupMenu.h:457
Definition juce_PopupMenu.h:80
void addItem(Item newItem)
Definition juce_PopupMenu.cpp:1753
Definition juce_Rectangle.h:67
Definition juce_StretchableObjectResizer.h:47
void addItem(double currentSize, double minSize, double maxSize, int order=0)
Definition juce_StretchableObjectResizer.cpp:32
double getItemSize(int index) const noexcept
Definition juce_StretchableObjectResizer.cpp:48
void resizeToFit(double targetSize)
Definition juce_StretchableObjectResizer.cpp:54
Definition juce_String.h:53
Definition juce_TableHeaderComponent.cpp:30
DragOverlayComp(const Image &i)
Definition juce_TableHeaderComponent.cpp:32
void paint(Graphics &g) override
Definition juce_TableHeaderComponent.cpp:39
Image image
Definition juce_TableHeaderComponent.cpp:44
Definition juce_TableHeaderComponent.h:305
virtual void tableColumnDraggingChanged(TableHeaderComponent *tableHeader, int columnIdNowBeingDragged)
Definition juce_TableHeaderComponent.cpp:896
Definition juce_TableHeaderComponent.h:47
bool columnsResized
Definition juce_TableHeaderComponent.h:438
void setColumnVisible(int columnId, bool shouldBeVisible)
Definition juce_TableHeaderComponent.cpp:351
int getIndexOfColumnId(int columnId, bool onlyCountVisibleColumns) const
Definition juce_TableHeaderComponent.cpp:208
int getColumnIdOfIndex(int index, bool onlyCountVisibleColumns) const
Definition juce_TableHeaderComponent.cpp:226
void removeListener(Listener *listenerToRemove)
Definition juce_TableHeaderComponent.cpp:471
int columnIdUnderMouse
Definition juce_TableHeaderComponent.h:441
std::unique_ptr< AccessibilityHandler > createAccessibilityHandler() override
Definition juce_TableHeaderComponent.cpp:901
int columnIdBeingResized
Definition juce_TableHeaderComponent.h:440
void reSortTable()
Definition juce_TableHeaderComponent.cpp:409
int draggingColumnOffset
Definition juce_TableHeaderComponent.h:441
void setColumnName(int columnId, const String &newName)
Definition juce_TableHeaderComponent.cpp:94
void setColumnUnderMouse(int columnId)
Definition juce_TableHeaderComponent.cpp:861
void mouseExit(const MouseEvent &) override
Definition juce_TableHeaderComponent.cpp:539
virtual void addMenuItems(PopupMenu &menu, int columnIdClicked)
Definition juce_TableHeaderComponent.cpp:484
int getResizeDraggerAt(int mouseX) const
Definition juce_TableHeaderComponent.cpp:838
bool sortChanged
Definition juce_TableHeaderComponent.h:438
int visibleIndexToTotalIndex(int visibleIndex) const
Definition juce_TableHeaderComponent.cpp:773
OwnedArray< ColumnInfo > columns
Definition juce_TableHeaderComponent.h:433
void paint(Graphics &) override
Definition juce_TableHeaderComponent.cpp:499
void mouseDrag(const MouseEvent &) override
Definition juce_TableHeaderComponent.cpp:559
virtual void showColumnChooserMenu(int columnIdClicked)
Definition juce_TableHeaderComponent.cpp:882
void mouseEnter(const MouseEvent &) override
Definition juce_TableHeaderComponent.cpp:538
virtual void columnClicked(int columnId, const ModifierKeys &mods)
Definition juce_TableHeaderComponent.cpp:477
int columnIdBeingDragged
Definition juce_TableHeaderComponent.h:440
bool stretchToFit
Definition juce_TableHeaderComponent.h:439
void sendColumnsChanged()
Definition juce_TableHeaderComponent.cpp:791
virtual void reactToMenuItem(int menuReturnId, int columnIdClicked)
Definition juce_TableHeaderComponent.cpp:493
bool columnsChanged
Definition juce_TableHeaderComponent.h:438
int draggingColumnOriginalIndex
Definition juce_TableHeaderComponent.h:441
String getColumnName(int columnId) const
Definition juce_TableHeaderComponent.cpp:86
int getColumnWidth(int columnId) const
Definition juce_TableHeaderComponent.cpp:165
void removeColumn(int columnIdToRemove)
Definition juce_TableHeaderComponent.cpp:132
void moveColumn(int columnId, int newVisibleIndex)
Definition juce_TableHeaderComponent.cpp:153
void restoreFromString(const String &storedVersion)
Definition juce_TableHeaderComponent.cpp:437
TableHeaderComponent()
Definition juce_TableHeaderComponent.cpp:51
~TableHeaderComponent() override
Definition juce_TableHeaderComponent.cpp:55
void mouseUp(const MouseEvent &) override
Definition juce_TableHeaderComponent.cpp:729
bool isStretchToFitActive() const
Definition juce_TableHeaderComponent.cpp:300
void resizeAllColumnsToFit(int targetTotalWidth)
Definition juce_TableHeaderComponent.cpp:305
int getSortColumnId() const
Definition juce_TableHeaderComponent.cpp:391
void removeAllColumns()
Definition juce_TableHeaderComponent.cpp:144
int getNumColumns(bool onlyCountVisibleColumns) const
Definition juce_TableHeaderComponent.cpp:70
Array< Listener * > listeners
Definition juce_TableHeaderComponent.h:434
bool menuActive
Definition juce_TableHeaderComponent.h:439
MouseCursor getMouseCursor() override
Definition juce_TableHeaderComponent.cpp:750
void mouseMove(const MouseEvent &) override
Definition juce_TableHeaderComponent.cpp:537
@ sortable
Definition juce_TableHeaderComponent.h:67
@ visible
Definition juce_TableHeaderComponent.h:63
@ draggable
Definition juce_TableHeaderComponent.h:65
@ sortedForwards
Definition juce_TableHeaderComponent.h:68
@ appearsOnColumnMenu
Definition juce_TableHeaderComponent.h:66
@ sortedBackwards
Definition juce_TableHeaderComponent.h:69
@ resizable
Definition juce_TableHeaderComponent.h:64
std::unique_ptr< Component > dragOverlayComp
Definition juce_TableHeaderComponent.h:435
void setSortColumnId(int columnId, bool sortForwards)
Definition juce_TableHeaderComponent.cpp:377
int initialColumnWidth
Definition juce_TableHeaderComponent.h:440
String toString() const
Definition juce_TableHeaderComponent.cpp:417
void endDrag(int finalIndex)
Definition juce_TableHeaderComponent.cpp:712
void setStretchToFitActive(bool shouldStretchToFit)
Definition juce_TableHeaderComponent.cpp:293
int lastDeliberateWidth
Definition juce_TableHeaderComponent.h:441
Rectangle< int > getColumnPosition(int index) const
Definition juce_TableHeaderComponent.cpp:237
void addColumn(const String &columnName, int columnId, int width, int minimumWidth=30, int maximumWidth=-1, int propertyFlags=defaultFlags, int insertIndex=-1)
Definition juce_TableHeaderComponent.cpp:106
int getColumnIdAtX(int xToFind) const
Definition juce_TableHeaderComponent.cpp:261
void beginDrag(const MouseEvent &)
Definition juce_TableHeaderComponent.cpp:677
int getTotalWidth() const
Definition juce_TableHeaderComponent.cpp:282
void addListener(Listener *newListener)
Definition juce_TableHeaderComponent.cpp:466
bool isColumnVisible(int columnId) const
Definition juce_TableHeaderComponent.cpp:368
void handleAsyncUpdate() override
Definition juce_TableHeaderComponent.cpp:801
bool isPopupMenuActive() const
Definition juce_TableHeaderComponent.cpp:66
void resizeColumnsToFit(int firstColumnIndex, int targetTotalWidth)
Definition juce_TableHeaderComponent.cpp:315
void mouseDown(const MouseEvent &) override
Definition juce_TableHeaderComponent.cpp:541
bool isSortedForwards() const
Definition juce_TableHeaderComponent.cpp:400
void setColumnWidth(int columnId, int newWidth)
Definition juce_TableHeaderComponent.cpp:173
void setPopupMenuActive(bool hasMenu)
Definition juce_TableHeaderComponent.cpp:61
void updateColumnUnderMouse(const MouseEvent &)
Definition juce_TableHeaderComponent.cpp:870
ColumnInfo * getInfoForId(int columnId) const
Definition juce_TableHeaderComponent.cpp:764
Definition juce_XmlElement.h:83
String toString(const TextFormat &format={}) const
Definition juce_XmlElement.cpp:352
XmlElement * createNewChildElement(StringRef tagName)
Definition juce_XmlElement.cpp:733
void setAttribute(const Identifier &attributeName, const String &newValue)
Definition juce_XmlElement.cpp:615
* e
Definition inflate.c:1404
UINT_D64 w
Definition inflate.c:942
unsigned * m
Definition inflate.c:1559
int g
Definition inflate.c:1573
register unsigned i
Definition inflate.c:1575
unsigned s
Definition inflate.c:1555
unsigned x[BMAX+1]
Definition inflate.c:1586
static int width
Definition pugl.h:1593
#define jassert(expression)
#define JUCE_DECLARE_NON_COPYABLE(className)
#define jassertfalse
Definition carla_juce.cpp:31
constexpr Type jmin(Type a, Type b)
Definition juce_MathsFunctions.h:106
std::unique_ptr< XmlElement > parseXMLIfTagMatches(const String &textToParse, StringRef requiredTag)
Definition juce_XmlDocument.cpp:51
constexpr Type jmax(Type a, Type b)
Definition juce_MathsFunctions.h:94
Type jlimit(Type lowerLimit, Type upperLimit, Type valueToConstrain) noexcept
Definition juce_MathsFunctions.h:262
static void tableHeaderMenuCallback(int result, TableHeaderComponent *tableHeader, int columnIdClicked)
Definition juce_TableHeaderComponent.cpp:876
bool isPositiveAndBelow(Type1 valueToTest, Type2 upperLimit) noexcept
Definition juce_MathsFunctions.h:279
@ tableHeader
Definition juce_AccessibilityRole.h:51
Definition juce_TableHeaderComponent.h:425
int propertyFlags
Definition juce_TableHeaderComponent.h:427
bool isVisible() const
Definition juce_TableHeaderComponent.cpp:759
Definition juce_XmlElement.h:136
int n
Definition crypt.c:458
return c
Definition crypt.c:175
int result
Definition process.c:1455
ss
Definition zipinfo.c:2292