1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-15 00:24:19 +00:00

Couple of minor fixes and clean-ups to various components.

This commit is contained in:
Julian Storer 2010-10-24 16:27:44 +01:00
parent 4e1c66b02e
commit 0a1f3857ae
30 changed files with 955 additions and 1224 deletions

View file

@ -150,6 +150,8 @@ public:
~TreeViewDemo()
{
fileTreeComp = 0;
directoryList = 0; // (need to make sure this is deleted before the TimeSliceThread)
}
void paint (Graphics& g)

View file

@ -1065,39 +1065,17 @@ public:
switch (buttonId)
{
case menuButton:
desc = "menu button (short)";
break;
case playButton:
desc = "play button";
break;
case plusButton:
desc = "plus button";
break;
case minusButton:
desc = "minus button";
break;
case rightButton:
desc = "right button (short)";
break;
case leftButton:
desc = "left button (short)";
break;
case rightButton_Long:
desc = "right button (long)";
break;
case leftButton_Long:
desc = "left button (long)";
break;
case menuButton_Long:
desc = "menu button (long)";
break;
case playButtonSleepMode:
desc = "play (sleep mode)";
break;
case switched:
desc = "remote switched";
break;
case menuButton: desc = "menu button (short)"; break;
case playButton: desc = "play button"; break;
case plusButton: desc = "plus button"; break;
case minusButton: desc = "minus button"; break;
case rightButton: desc = "right button (short)"; break;
case leftButton: desc = "left button (short)"; break;
case rightButton_Long: desc = "right button (long)"; break;
case leftButton_Long: desc = "left button (long)"; break;
case menuButton_Long: desc = "menu button (long)"; break;
case playButtonSleepMode: desc = "play (sleep mode)"; break;
case switched: desc = "remote switched"; break;
}
if (isDown)

View file

@ -76,7 +76,7 @@ public:
if (image != 0)
{
image->drawWithin (g, r.getX(), r.getY(), r.getWidth(), r.getHeight(),
image->drawWithin (g, r.toFloat(),
mode == stretched ? RectanglePlacement::stretchToFit
: (mode == proportionalReducingOnly ? (RectanglePlacement::centred | RectanglePlacement::onlyReduceInSize)
: RectanglePlacement::centred),

File diff suppressed because it is too large Load diff

View file

@ -64,7 +64,7 @@
*/
#define JUCE_MAJOR_VERSION 1
#define JUCE_MINOR_VERSION 52
#define JUCE_BUILDNUMBER 81
#define JUCE_BUILDNUMBER 82
/** Current Juce version number.
@ -21128,6 +21128,7 @@ public:
/** Moves the x position, adjusting the width so that the right-hand edge remains in the same place.
If the x is moved to be on the right of the current right-hand edge, the width will be set to zero.
@see withLeft
*/
void setLeft (const ValueType newLeft) throw()
{
@ -21135,8 +21136,15 @@ public:
x = newLeft;
}
/** Returns a new rectangle with a different x position, but the same right-hand edge as this one.
If the new x is beyond the right of the current right-hand edge, the width will be set to zero.
@see setLeft
*/
const Rectangle withLeft (const ValueType newLeft) const throw() { return Rectangle (newLeft, y, jmax (ValueType(), x + w - newLeft), h); }
/** Moves the y position, adjusting the height so that the bottom edge remains in the same place.
If the y is moved to be below the current bottom edge, the height will be set to zero.
@see withTop
*/
void setTop (const ValueType newTop) throw()
{
@ -21144,9 +21152,15 @@ public:
y = newTop;
}
/** Returns a new rectangle with a different y position, but the same bottom edge as this one.
If the new y is beyond the bottom of the current rectangle, the height will be set to zero.
@see setTop
*/
const Rectangle withTop (const ValueType newTop) const throw() { return Rectangle (x, newTop, w, jmax (ValueType(), y + h - newTop)); }
/** Adjusts the width so that the right-hand edge of the rectangle has this new value.
If the new right is below the current X value, the X will be pushed down to match it.
@see getRight
@see getRight, withRight
*/
void setRight (const ValueType newRight) throw()
{
@ -21154,9 +21168,15 @@ public:
w = newRight - x;
}
/** Returns a new rectangle with a different right-hand edge position, but the same left-hand edge as this one.
If the new right edge is below the current left-hand edge, the width will be set to zero.
@see setRight
*/
const Rectangle withRight (const ValueType newRight) const throw() { return Rectangle (jmin (x, newRight), y, jmax (ValueType(), newRight - x), h); }
/** Adjusts the height so that the bottom edge of the rectangle has this new value.
If the new bottom is lower than the current Y value, the Y will be pushed down to match it.
@see getBottom
@see getBottom, withBottom
*/
void setBottom (const ValueType newBottom) throw()
{
@ -21164,6 +21184,12 @@ public:
h = newBottom - y;
}
/** Returns a new rectangle with a different bottom edge position, but the same top edge as this one.
If the new y is beyond the bottom of the current rectangle, the height will be set to zero.
@see setBottom
*/
const Rectangle withBottom (const ValueType newBottom) const throw() { return Rectangle (x, jmin (y, newBottom), w, jmax (ValueType(), newBottom - y)); }
/** Moves the rectangle's position by adding amount to its x and y co-ordinates. */
void translate (const ValueType deltaX,
const ValueType deltaY) throw()
@ -41867,8 +41893,8 @@ public:
private:
KnownPluginList& list;
File deadMansPedalFile;
ListBox* listBox;
TextButton* optionsButton;
ListBox listBox;
TextButton optionsButton;
PropertiesFile* propertiesToUse;
int typeToScan;
@ -46797,10 +46823,11 @@ private:
CodeDocument::Position caretPos;
CodeDocument::Position selectionStart, selectionEnd;
class CaretComponent;
CaretComponent* caret;
ScrollBar* verticalScrollBar;
ScrollBar* horizontalScrollBar;
friend class ScopedPointer <CaretComponent>;
ScopedPointer<CaretComponent> caret;
ScrollBar verticalScrollBar, horizontalScrollBar;
enum DragType
{
@ -48628,7 +48655,7 @@ public:
private:
ToolbarItemFactory& factory;
Toolbar* toolbar;
Viewport* viewport;
Viewport viewport;
friend class Toolbar;
void replaceComponent (ToolbarItemComponent* comp);
@ -50045,11 +50072,12 @@ private:
Array<File> chosenFiles;
ListenerList <FileBrowserListener> listeners;
DirectoryContentsDisplayComponent* fileListComponent;
ScopedPointer<DirectoryContentsDisplayComponent> fileListComponent;
FilePreviewComponent* previewComp;
ComboBox* currentPathBox;
TextEditor* filenameBox;
Button* goUpButton;
ComboBox currentPathBox;
TextEditor filenameBox;
Label fileLabel;
ScopedPointer<Button> goUpButton;
TimeSliceThread thread;
@ -51944,9 +51972,7 @@ class JUCE_API FileSearchPathListComponent : public Component,
{
public:
/** Creates an empty FileSearchPathListComponent.
*/
/** Creates an empty FileSearchPathListComponent. */
FileSearchPathListComponent();
/** Destructor. */
@ -52007,12 +52033,9 @@ private:
FileSearchPath path;
File defaultBrowseTarget;
ListBox* listBox;
Button* addButton;
Button* removeButton;
TextButton* changeButton;
DrawableButton* upButton;
DrawableButton* downButton;
ListBox listBox;
TextButton addButton, removeButton, changeButton;
DrawableButton upButton, downButton;
void changed();
void updateButtons();
@ -57860,8 +57883,7 @@ private:
int rangeStart, rangeEnd, firstKey;
bool canScroll, mouseDragging, useMousePositionForVelocity;
Button* scrollDown;
Button* scrollUp;
ScopedPointer<Button> scrollDown, scrollUp;
Array <KeyPress> keyPresses;
Array <int> keyPressNotes;
@ -58368,7 +58390,7 @@ public:
given size and title, and will run it modally, returning when the user
closes the dialog box.
*/
void showInDialogBox (const String& dialogtitle,
void showInDialogBox (const String& dialogTitle,
int dialogWidth,
int dialogHeight,
const Colour& backgroundColour = Colours::white);
@ -58399,6 +58421,7 @@ private:
String currentPageName;
ScopedPointer <Component> currentPage;
OwnedArray<DrawableButton> buttons;
int buttonSize;
PreferencesPanel (const PreferencesPanel&);
@ -62506,12 +62529,12 @@ class UnitTestRunner;
@see UnitTestRunner
*/
class UnitTest
class JUCE_API UnitTest
{
public:
/** Creates a test with the given name. */
UnitTest (const String& name);
explicit UnitTest (const String& name);
/** Destructor. */
virtual ~UnitTest();
@ -62615,7 +62638,7 @@ private:
@see UnitTest
*/
class UnitTestRunner
class JUCE_API UnitTestRunner
{
public:

View file

@ -43,13 +43,15 @@ PluginListComponent::PluginListComponent (KnownPluginList& listToEdit,
PropertiesFile* const propertiesToUse_)
: list (listToEdit),
deadMansPedalFile (deadMansPedalFile_),
optionsButton ("Options..."),
propertiesToUse (propertiesToUse_)
{
addAndMakeVisible (listBox = new ListBox (String::empty, this));
listBox.setModel (this);
addAndMakeVisible (&listBox);
addAndMakeVisible (optionsButton = new TextButton ("Options..."));
optionsButton->addButtonListener (this);
optionsButton->setTriggeredOnMouseDown (true);
addAndMakeVisible (&optionsButton);
optionsButton.addButtonListener (this);
optionsButton.setTriggeredOnMouseDown (true);
setSize (400, 600);
list.addChangeListener (this);
@ -59,20 +61,19 @@ PluginListComponent::PluginListComponent (KnownPluginList& listToEdit,
PluginListComponent::~PluginListComponent()
{
list.removeChangeListener (this);
deleteAllChildren();
}
void PluginListComponent::resized()
{
listBox->setBounds (0, 0, getWidth(), getHeight() - 30);
optionsButton->changeWidthToFitText (24);
optionsButton->setTopLeftPosition (8, getHeight() - 28);
listBox.setBounds (0, 0, getWidth(), getHeight() - 30);
optionsButton.changeWidthToFitText (24);
optionsButton.setTopLeftPosition (8, getHeight() - 28);
}
void PluginListComponent::changeListenerCallback (void*)
{
listBox->updateContent();
listBox->repaint();
listBox.updateContent();
listBox.repaint();
}
int PluginListComponent::getNumRows()
@ -130,14 +131,14 @@ void PluginListComponent::deleteKeyPressed (int lastRowSelected)
list.removeType (lastRowSelected);
}
void PluginListComponent::buttonClicked (Button* b)
void PluginListComponent::buttonClicked (Button* button)
{
if (optionsButton == b)
if (button == &optionsButton)
{
PopupMenu menu;
menu.addItem (1, TRANS("Clear list"));
menu.addItem (5, TRANS("Remove selected plugin from list"), listBox->getNumSelectedRows() > 0);
menu.addItem (6, TRANS("Show folder containing selected plugin"), listBox->getNumSelectedRows() > 0);
menu.addItem (5, TRANS("Remove selected plugin from list"), listBox.getNumSelectedRows() > 0);
menu.addItem (6, TRANS("Show folder containing selected plugin"), listBox.getNumSelectedRows() > 0);
menu.addItem (7, TRANS("Remove any plugins whose files no longer exist"));
menu.addSeparator();
menu.addItem (2, TRANS("Sort alphabetically"));
@ -153,7 +154,7 @@ void PluginListComponent::buttonClicked (Button* b)
menu.addItem (10 + i, "Scan for new or updated " + format->getName() + " plugins...");
}
const int r = menu.showAt (optionsButton);
const int r = menu.showAt (&optionsButton);
if (r == 1)
{
@ -173,7 +174,7 @@ void PluginListComponent::buttonClicked (Button* b)
}
else if (r == 5)
{
const SparseSet <int> selected (listBox->getSelectedRows());
const SparseSet <int> selected (listBox.getSelectedRows());
for (int i = list.getNumTypes(); --i >= 0;)
if (selected.contains (i))
@ -181,7 +182,7 @@ void PluginListComponent::buttonClicked (Button* b)
}
else if (r == 6)
{
const PluginDescription* const desc = list.getType (listBox->getSelectedRow());
const PluginDescription* const desc = list.getType (listBox.getSelectedRow());
if (desc != 0)
{

View file

@ -86,8 +86,8 @@ public:
private:
KnownPluginList& list;
File deadMansPedalFile;
ListBox* listBox;
TextButton* optionsButton;
ListBox listBox;
TextButton optionsButton;
PropertiesFile* propertiesToUse;
int typeToScan;

View file

@ -33,7 +33,7 @@
*/
#define JUCE_MAJOR_VERSION 1
#define JUCE_MINOR_VERSION 52
#define JUCE_BUILDNUMBER 81
#define JUCE_BUILDNUMBER 82
/** Current Juce version number.

View file

@ -44,10 +44,6 @@ public:
setInterceptsMouseClicks (false, false);
}
~CaretComponent()
{
}
void paint (Graphics& g)
{
g.fillAll (findColour (CodeEditorComponent::caretColourId));
@ -296,6 +292,8 @@ CodeEditorComponent::CodeEditorComponent (CodeDocument& document_,
columnToTryToMaintain (-1),
useSpacesForTabs (false),
xOffset (0),
verticalScrollBar (true),
horizontalScrollBar (false),
codeTokeniser (codeTokeniser_)
{
caretPos = CodeDocument::Position (&document_, 0, 0);
@ -311,11 +309,11 @@ CodeEditorComponent::CodeEditorComponent (CodeDocument& document_,
setMouseCursor (MouseCursor (MouseCursor::IBeamCursor));
setWantsKeyboardFocus (true);
addAndMakeVisible (verticalScrollBar = new ScrollBar (true));
verticalScrollBar->setSingleStepSize (1.0);
addAndMakeVisible (&verticalScrollBar);
verticalScrollBar.setSingleStepSize (1.0);
addAndMakeVisible (horizontalScrollBar = new ScrollBar (false));
horizontalScrollBar->setSingleStepSize (1.0);
addAndMakeVisible (&horizontalScrollBar);
horizontalScrollBar.setSingleStepSize (1.0);
addAndMakeVisible (caret = new CaretComponent (*this));
@ -325,15 +323,14 @@ CodeEditorComponent::CodeEditorComponent (CodeDocument& document_,
resetToDefaultColours();
verticalScrollBar->addListener (this);
horizontalScrollBar->addListener (this);
verticalScrollBar.addListener (this);
horizontalScrollBar.addListener (this);
document.addListener (this);
}
CodeEditorComponent::~CodeEditorComponent()
{
document.removeListener (this);
deleteAllChildren();
}
void CodeEditorComponent::loadContent (const String& newContent)
@ -383,8 +380,8 @@ void CodeEditorComponent::resized()
rebuildLineTokens();
caret->updatePosition();
verticalScrollBar->setBounds (getWidth() - scrollbarThickness, 0, scrollbarThickness, getHeight() - scrollbarThickness);
horizontalScrollBar->setBounds (gutter, getHeight() - scrollbarThickness, getWidth() - scrollbarThickness - gutter, scrollbarThickness);
verticalScrollBar.setBounds (getWidth() - scrollbarThickness, 0, scrollbarThickness, getHeight() - scrollbarThickness);
horizontalScrollBar.setBounds (gutter, getHeight() - scrollbarThickness, getWidth() - scrollbarThickness - gutter, scrollbarThickness);
updateScrollBars();
}
@ -394,7 +391,7 @@ void CodeEditorComponent::paint (Graphics& g)
g.fillAll (findColour (CodeEditorComponent::backgroundColourId));
g.reduceClipRegion (gutter, 0, verticalScrollBar->getX() - gutter, horizontalScrollBar->getY());
g.reduceClipRegion (gutter, 0, verticalScrollBar.getX() - gutter, horizontalScrollBar.getY());
g.setFont (font);
const int baselineOffset = (int) font.getAscent();
@ -468,7 +465,7 @@ void CodeEditorComponent::rebuildLineTokens()
if (minLineToRepaint <= maxLineToRepaint)
{
repaint (gutter, lineHeight * minLineToRepaint - 1,
verticalScrollBar->getX() - gutter,
verticalScrollBar.getX() - gutter,
lineHeight * (1 + maxLineToRepaint - minLineToRepaint) + 2);
}
}
@ -540,11 +537,11 @@ void CodeEditorComponent::deselectAll()
void CodeEditorComponent::updateScrollBars()
{
verticalScrollBar->setRangeLimits (0, jmax (document.getNumLines(), firstLineOnScreen + linesOnScreen));
verticalScrollBar->setCurrentRange (firstLineOnScreen, linesOnScreen);
verticalScrollBar.setRangeLimits (0, jmax (document.getNumLines(), firstLineOnScreen + linesOnScreen));
verticalScrollBar.setCurrentRange (firstLineOnScreen, linesOnScreen);
horizontalScrollBar->setRangeLimits (0, jmax ((double) document.getMaximumLineLength(), xOffset + columnsOnScreen));
horizontalScrollBar->setCurrentRange (xOffset, columnsOnScreen);
horizontalScrollBar.setRangeLimits (0, jmax ((double) document.getMaximumLineLength(), xOffset + columnsOnScreen));
horizontalScrollBar.setCurrentRange (xOffset, columnsOnScreen);
}
void CodeEditorComponent::scrollToLineInternal (int newFirstLineOnScreen)
@ -1079,11 +1076,11 @@ void CodeEditorComponent::mouseDoubleClick (const MouseEvent& e)
void CodeEditorComponent::mouseWheelMove (const MouseEvent& e, float wheelIncrementX, float wheelIncrementY)
{
if ((verticalScrollBar->isVisible() && wheelIncrementY != 0)
|| (horizontalScrollBar->isVisible() && wheelIncrementX != 0))
if ((verticalScrollBar.isVisible() && wheelIncrementY != 0)
|| (horizontalScrollBar.isVisible() && wheelIncrementX != 0))
{
verticalScrollBar->mouseWheelMove (e, 0, wheelIncrementY);
horizontalScrollBar->mouseWheelMove (e, wheelIncrementX, 0);
verticalScrollBar.mouseWheelMove (e, 0, wheelIncrementY);
horizontalScrollBar.mouseWheelMove (e, wheelIncrementX, 0);
}
else
{
@ -1093,7 +1090,7 @@ void CodeEditorComponent::mouseWheelMove (const MouseEvent& e, float wheelIncrem
void CodeEditorComponent::scrollBarMoved (ScrollBar* scrollBarThatHasMoved, double newRangeStart)
{
if (scrollBarThatHasMoved == verticalScrollBar)
if (scrollBarThatHasMoved == &verticalScrollBar)
scrollToLineInternal ((int) newRangeStart);
else
scrollToColumnInternal (newRangeStart);

View file

@ -271,10 +271,11 @@ private:
CodeDocument::Position caretPos;
CodeDocument::Position selectionStart, selectionEnd;
class CaretComponent;
CaretComponent* caret;
ScrollBar* verticalScrollBar;
ScrollBar* horizontalScrollBar;
friend class ScopedPointer <CaretComponent>;
ScopedPointer<CaretComponent> caret;
ScrollBar verticalScrollBar, horizontalScrollBar;
enum DragType
{

View file

@ -39,18 +39,11 @@ class ListBoxRowComponent : public Component,
{
public:
ListBoxRowComponent (ListBox& owner_)
: owner (owner_),
row (-1),
selected (false),
isDragging (false)
: owner (owner_), row (-1),
selected (false), isDragging (false), selectRowOnMouseUp (false)
{
}
~ListBoxRowComponent()
{
deleteAllChildren();
}
void paint (Graphics& g)
{
if (owner.getModel() != 0)
@ -68,20 +61,12 @@ public:
if (owner.getModel() != 0)
{
Component* const customComp = owner.getModel()->refreshComponentForRow (row_, selected_, getChildComponent (0));
customComponent = owner.getModel()->refreshComponentForRow (row_, selected_, customComponent.release());
if (customComp != 0)
if (customComponent != 0)
{
addAndMakeVisible (customComp);
customComp->setBounds (getLocalBounds());
for (int i = getNumChildComponents(); --i >= 0;)
if (getChildComponent (i) != customComp)
delete getChildComponent (i);
}
else
{
deleteAllChildren();
addAndMakeVisible (customComponent);
customComponent->setBounds (getLocalBounds());
}
}
}
@ -145,8 +130,8 @@ public:
void resized()
{
if (getNumChildComponents() > 0)
getChildComponent(0)->setBounds (getLocalBounds());
if (customComponent != 0)
customComponent->setBounds (getLocalBounds());
}
const String getTooltip()
@ -159,7 +144,7 @@ public:
juce_UseDebuggingNewOperator
bool neededFlag;
ScopedPointer<Component> customComponent;
private:
ListBox& owner;
@ -175,36 +160,37 @@ private:
class ListViewport : public Viewport
{
public:
int firstIndex, firstWholeIndex, lastWholeIndex;
bool hasUpdated;
//==============================================================================
ListViewport (ListBox& owner_)
: owner (owner_)
{
setWantsKeyboardFocus (false);
setViewedComponent (new Component());
getViewedComponent()->addMouseListener (this, false);
getViewedComponent()->setWantsKeyboardFocus (false);
Component* const content = new Component();
setViewedComponent (content);
content->addMouseListener (this, false);
content->setWantsKeyboardFocus (false);
}
~ListViewport()
{
getViewedComponent()->removeMouseListener (this);
getViewedComponent()->deleteAllChildren();
}
ListBoxRowComponent* getComponentForRow (const int row) const throw()
{
return static_cast <ListBoxRowComponent*>
(getViewedComponent()->getChildComponent (row % jmax (1, getViewedComponent()->getNumChildComponents())));
return rows [row % jmax (1, rows.size())];
}
ListBoxRowComponent* getComponentForRowIfOnscreen (const int row) const throw()
{
return (row >= firstIndex && row < firstIndex + rows.size())
? getComponentForRow (row) : 0;
}
int getRowNumberOfComponent (Component* const rowComponent) const throw()
{
const int index = getIndexOfChildComponent (rowComponent);
const int num = getViewedComponent()->getNumChildComponents();
const int num = rows.size();
for (int i = num; --i >= 0;)
if (((firstIndex + i) % jmax (1, num)) == index)
@ -213,12 +199,6 @@ public:
return -1;
}
Component* getComponentForRowIfOnscreen (const int row) const throw()
{
return (row >= firstIndex && row < firstIndex + getViewedComponent()->getNumChildComponents())
? getComponentForRow (row) : 0;
}
void visibleAreaChanged (int, int, int, int)
{
updateVisibleArea (true);
@ -256,18 +236,13 @@ public:
const int w = getViewedComponent()->getWidth();
const int numNeeded = 2 + getMaximumVisibleHeight() / rowHeight;
rows.removeRange (numNeeded, rows.size());
while (numNeeded > getViewedComponent()->getNumChildComponents())
getViewedComponent()->addAndMakeVisible (new ListBoxRowComponent (owner));
jassert (numNeeded >= 0);
while (numNeeded < getViewedComponent()->getNumChildComponents())
while (numNeeded > rows.size())
{
Component* const rowToRemove
= getViewedComponent()->getChildComponent (getViewedComponent()->getNumChildComponents() - 1);
delete rowToRemove;
ListBoxRowComponent* newRow = new ListBoxRowComponent (owner);
rows.add (newRow);
getViewedComponent()->addAndMakeVisible (newRow);
}
firstIndex = y / rowHeight;
@ -295,6 +270,50 @@ public:
owner.headerComponent->getHeight());
}
void selectRow (const int row, const int rowHeight, const bool dontScroll,
const int lastRowSelected, const int totalItems, const bool isMouseClick)
{
hasUpdated = false;
if (row < firstWholeIndex && ! dontScroll)
{
setViewPosition (getViewPositionX(), row * rowHeight);
}
else if (row >= lastWholeIndex && ! dontScroll)
{
const int rowsOnScreen = lastWholeIndex - firstWholeIndex;
if (row >= lastRowSelected + rowsOnScreen
&& rowsOnScreen < totalItems - 1
&& ! isMouseClick)
{
setViewPosition (getViewPositionX(),
jlimit (0, jmax (0, totalItems - rowsOnScreen), row) * rowHeight);
}
else
{
setViewPosition (getViewPositionX(),
jmax (0, (row + 1) * rowHeight - getMaximumVisibleHeight()));
}
}
if (! hasUpdated)
updateContents();
}
void scrollToEnsureRowIsOnscreen (const int row, const int rowHeight)
{
if (row < firstWholeIndex)
{
setViewPosition (getViewPositionX(), row * rowHeight);
}
else if (row >= lastWholeIndex)
{
setViewPosition (getViewPositionX(),
jmax (0, (row + 1) * rowHeight - getMaximumVisibleHeight()));
}
}
void paint (Graphics& g)
{
if (isOpaque())
@ -323,6 +342,9 @@ public:
private:
ListBox& owner;
OwnedArray<ListBoxRowComponent> rows;
int firstIndex, firstWholeIndex, lastWholeIndex;
bool hasUpdated;
ListViewport (const ListViewport&);
ListViewport& operator= (const ListViewport&);
@ -467,34 +489,8 @@ void ListBox::selectRowInternal (const int row,
if (getHeight() == 0 || getWidth() == 0)
dontScroll = true;
viewport->hasUpdated = false;
if (row < viewport->firstWholeIndex && ! dontScroll)
{
viewport->setViewPosition (viewport->getViewPositionX(),
row * getRowHeight());
}
else if (row >= viewport->lastWholeIndex && ! dontScroll)
{
const int rowsOnScreen = viewport->lastWholeIndex - viewport->firstWholeIndex;
if (row >= lastRowSelected + rowsOnScreen
&& rowsOnScreen < totalItems - 1
&& ! isMouseClick)
{
viewport->setViewPosition (viewport->getViewPositionX(),
jlimit (0, jmax (0, totalItems - rowsOnScreen), row)
* getRowHeight());
}
else
{
viewport->setViewPosition (viewport->getViewPositionX(),
jmax (0, (row + 1) * getRowHeight() - viewport->getMaximumVisibleHeight()));
}
}
if (! viewport->hasUpdated)
viewport->updateContents();
viewport->selectRow (row, getRowHeight(), dontScroll,
lastRowSelected, totalItems, isMouseClick);
lastRowSelected = row;
model->selectedRowsChanged (row);
@ -645,8 +641,8 @@ int ListBox::getInsertionIndexForPosition (const int x, const int y) const throw
Component* ListBox::getComponentForRowNumber (const int row) const throw()
{
Component* const listRowComp = viewport->getComponentForRowIfOnscreen (row);
return listRowComp != 0 ? listRowComp->getChildComponent (0) : 0;
ListBoxRowComponent* const listRowComp = viewport->getComponentForRowIfOnscreen (row);
return listRowComp != 0 ? static_cast <Component*> (listRowComp->customComponent) : 0;
}
int ListBox::getRowNumberOfComponent (Component* const rowComponent) const throw()
@ -689,16 +685,7 @@ int ListBox::getVisibleRowWidth() const throw()
void ListBox::scrollToEnsureRowIsOnscreen (const int row)
{
if (row < viewport->firstWholeIndex)
{
viewport->setViewPosition (viewport->getViewPositionX(),
row * getRowHeight());
}
else if (row >= viewport->lastWholeIndex)
{
viewport->setViewPosition (viewport->getViewPositionX(),
jmax (0, (row + 1) * getRowHeight() - viewport->getMaximumVisibleHeight()));
}
viewport->scrollToEnsureRowIsOnscreen (row, getRowHeight());
}
//==============================================================================
@ -951,43 +938,15 @@ Component* ListBoxModel::refreshComponentForRow (int, bool, Component* existingC
return 0;
}
void ListBoxModel::listBoxItemClicked (int, const MouseEvent&)
{
}
void ListBoxModel::listBoxItemDoubleClicked (int, const MouseEvent&)
{
}
void ListBoxModel::backgroundClicked()
{
}
void ListBoxModel::selectedRowsChanged (int)
{
}
void ListBoxModel::deleteKeyPressed (int)
{
}
void ListBoxModel::returnKeyPressed (int)
{
}
void ListBoxModel::listWasScrolled()
{
}
const String ListBoxModel::getDragSourceDescription (const SparseSet<int>&)
{
return String::empty;
}
const String ListBoxModel::getTooltipForRow (int)
{
return String::empty;
}
void ListBoxModel::listBoxItemClicked (int, const MouseEvent&) {}
void ListBoxModel::listBoxItemDoubleClicked (int, const MouseEvent&) {}
void ListBoxModel::backgroundClicked() {}
void ListBoxModel::selectedRowsChanged (int) {}
void ListBoxModel::deleteKeyPressed (int) {}
void ListBoxModel::returnKeyPressed (int) {}
void ListBoxModel::listWasScrolled() {}
const String ListBoxModel::getDragSourceDescription (const SparseSet<int>&) { return String::empty; }
const String ListBoxModel::getTooltipForRow (int) { return String::empty; }
END_JUCE_NAMESPACE

View file

@ -272,16 +272,12 @@ public:
{
}
~TableListBoxHeader()
{
}
void addMenuItems (PopupMenu& menu, int columnIdClicked)
{
if (owner.isAutoSizeMenuOptionShown())
{
menu.addItem (0xf836743, TRANS("Auto-size this column"), columnIdClicked != 0);
menu.addItem (0xf836744, TRANS("Auto-size all columns"), owner.getHeader()->getNumColumns (true) > 0);
menu.addItem (autoSizeColumnId, TRANS("Auto-size this column"), columnIdClicked != 0);
menu.addItem (autoSizeAllId, TRANS("Auto-size all columns"), owner.getHeader()->getNumColumns (true) > 0);
menu.addSeparator();
}
@ -290,11 +286,11 @@ public:
void reactToMenuItem (int menuReturnId, int columnIdClicked)
{
if (menuReturnId == 0xf836743)
if (menuReturnId == autoSizeColumnId)
{
owner.autoSizeColumn (columnIdClicked);
}
else if (menuReturnId == 0xf836744)
else if (menuReturnId == autoSizeAllId)
{
owner.autoSizeAllColumns();
}
@ -309,6 +305,8 @@ public:
private:
TableListBox& owner;
enum { autoSizeColumnId = 0xf836743, autoSizeAllId = 0xf836744 };
TableListBoxHeader (const TableListBoxHeader&);
TableListBoxHeader& operator= (const TableListBoxHeader&);
};

View file

@ -791,63 +791,59 @@ private:
const int optionFlags)
: factory (factory_),
toolbar (toolbar_),
styleBox (0),
defaultButton (0)
palette (factory_, toolbar_),
instructions (String::empty, TRANS ("You can drag the items above and drop them onto a toolbar to add them.\n\n"
"Items on the toolbar can also be dragged around to change their order, or dragged off the edge to delete them.")),
defaultButton (TRANS ("Restore to default set of items"))
{
addAndMakeVisible (palette = new ToolbarItemPalette (factory, toolbar));
addAndMakeVisible (&palette);
if ((optionFlags & (Toolbar::allowIconsOnlyChoice
| Toolbar::allowIconsWithTextChoice
| Toolbar::allowTextOnlyChoice)) != 0)
{
addAndMakeVisible (styleBox = new ComboBox (String::empty));
styleBox->setEditableText (false);
addAndMakeVisible (&styleBox);
styleBox.setEditableText (false);
if ((optionFlags & Toolbar::allowIconsOnlyChoice) != 0)
styleBox->addItem (TRANS("Show icons only"), 1);
if ((optionFlags & Toolbar::allowIconsWithTextChoice) != 0)
styleBox->addItem (TRANS("Show icons and descriptions"), 2);
if ((optionFlags & Toolbar::allowTextOnlyChoice) != 0)
styleBox->addItem (TRANS("Show descriptions only"), 3);
if ((optionFlags & Toolbar::allowIconsOnlyChoice) != 0) styleBox.addItem (TRANS("Show icons only"), 1);
if ((optionFlags & Toolbar::allowIconsWithTextChoice) != 0) styleBox.addItem (TRANS("Show icons and descriptions"), 2);
if ((optionFlags & Toolbar::allowTextOnlyChoice) != 0) styleBox.addItem (TRANS("Show descriptions only"), 3);
if (toolbar_->getStyle() == Toolbar::iconsOnly)
styleBox->setSelectedId (1);
else if (toolbar_->getStyle() == Toolbar::iconsWithText)
styleBox->setSelectedId (2);
else if (toolbar_->getStyle() == Toolbar::textOnly)
styleBox->setSelectedId (3);
int selectedStyle = 0;
switch (toolbar_->getStyle())
{
case Toolbar::iconsOnly: selectedStyle = 1; break;
case Toolbar::iconsWithText: selectedStyle = 2; break;
case Toolbar::textOnly: selectedStyle = 3; break;
}
styleBox->addListener (this);
styleBox.setSelectedId (selectedStyle);
styleBox.addListener (this);
}
if ((optionFlags & Toolbar::showResetToDefaultsButton) != 0)
{
addAndMakeVisible (defaultButton = new TextButton (TRANS ("Restore to default set of items")));
defaultButton->addButtonListener (this);
addAndMakeVisible (&defaultButton);
defaultButton.addButtonListener (this);
}
addAndMakeVisible (instructions = new Label (String::empty,
TRANS ("You can drag the items above and drop them onto a toolbar to add them.\n\nItems on the toolbar can also be dragged around to change their order, or dragged off the edge to delete them.")));
instructions->setFont (Font (13.0f));
addAndMakeVisible (&instructions);
instructions.setFont (Font (13.0f));
setSize (500, 300);
}
~CustomiserPanel()
{
deleteAllChildren();
}
void comboBoxChanged (ComboBox*)
{
if (styleBox->getSelectedId() == 1)
toolbar->setStyle (Toolbar::iconsOnly);
else if (styleBox->getSelectedId() == 2)
toolbar->setStyle (Toolbar::iconsWithText);
else if (styleBox->getSelectedId() == 3)
toolbar->setStyle (Toolbar::textOnly);
switch (styleBox.getSelectedId())
{
case 1: toolbar->setStyle (Toolbar::iconsOnly); break;
case 2: toolbar->setStyle (Toolbar::iconsWithText); break;
case 3: toolbar->setStyle (Toolbar::textOnly); break;
}
palette->resized(); // to make it update the styles
palette.resized(); // to make it update the styles
}
void buttonClicked (Button*)
@ -865,33 +861,28 @@ private:
background = dw->getBackgroundColour();
g.setColour (background.contrasting().withAlpha (0.3f));
g.fillRect (palette->getX(), palette->getBottom() - 1, palette->getWidth(), 1);
g.fillRect (palette.getX(), palette.getBottom() - 1, palette.getWidth(), 1);
}
void resized()
{
palette->setBounds (0, 0, getWidth(), getHeight() - 120);
palette.setBounds (0, 0, getWidth(), getHeight() - 120);
styleBox.setBounds (10, getHeight() - 110, 200, 22);
if (styleBox != 0)
styleBox->setBounds (10, getHeight() - 110, 200, 22);
defaultButton.changeWidthToFitText (22);
defaultButton.setTopLeftPosition (240, getHeight() - 110);
if (defaultButton != 0)
{
defaultButton->changeWidthToFitText (22);
defaultButton->setTopLeftPosition (240, getHeight() - 110);
}
instructions->setBounds (10, getHeight() - 80, getWidth() - 20, 80);
instructions.setBounds (10, getHeight() - 80, getWidth() - 20, 80);
}
private:
ToolbarItemFactory& factory;
Toolbar* const toolbar;
Label* instructions;
ToolbarItemPalette* palette;
ComboBox* styleBox;
TextButton* defaultButton;
ToolbarItemPalette palette;
Label instructions;
ComboBox styleBox;
TextButton defaultButton;
};
};

View file

@ -38,6 +38,7 @@ ToolbarItemPalette::ToolbarItemPalette (ToolbarItemFactory& factory_,
toolbar (toolbar_)
{
Component* const itemHolder = new Component();
viewport.setViewedComponent (itemHolder);
Array <int> allIds;
factory_.getAllToolbarItemIds (allIds);
@ -54,27 +55,24 @@ ToolbarItemPalette::ToolbarItemPalette (ToolbarItemFactory& factory_,
}
}
viewport = new Viewport();
viewport->setViewedComponent (itemHolder);
addAndMakeVisible (viewport);
addAndMakeVisible (&viewport);
}
ToolbarItemPalette::~ToolbarItemPalette()
{
viewport->getViewedComponent()->deleteAllChildren();
deleteAllChildren();
viewport.getViewedComponent()->deleteAllChildren();
}
//==============================================================================
void ToolbarItemPalette::resized()
{
viewport->setBoundsInset (BorderSize (1));
viewport.setBoundsInset (BorderSize (1));
Component* const itemHolder = viewport->getViewedComponent();
Component* const itemHolder = viewport.getViewedComponent();
const int indent = 8;
const int preferredWidth = viewport->getWidth() - viewport->getScrollBarThickness() - indent;
const int preferredWidth = viewport.getWidth() - viewport.getScrollBarThickness() - indent;
const int height = toolbar->getThickness();
int x = indent;
int y = indent;
@ -120,7 +118,7 @@ void ToolbarItemPalette::replaceComponent (ToolbarItemComponent* const comp)
tc->setBounds (comp->getBounds());
tc->setStyle (toolbar->getStyle());
tc->setEditingMode (comp->getEditingMode());
viewport->getViewedComponent()->addAndMakeVisible (tc, getIndexOfChildComponent (comp));
viewport.getViewedComponent()->addAndMakeVisible (tc, getIndexOfChildComponent (comp));
}
}

View file

@ -68,7 +68,7 @@ public:
private:
ToolbarItemFactory& factory;
Toolbar* toolbar;
Viewport* viewport;
Viewport viewport;
friend class Toolbar;
void replaceComponent (ToolbarItemComponent* comp);

View file

@ -49,7 +49,6 @@ public:
~TreeViewContentComponent()
{
deleteAllChildren();
}
void mouseDown (const MouseEvent& e)
@ -204,7 +203,10 @@ public:
const int visibleTop = -getY();
const int visibleBottom = visibleTop + getParentHeight();
BigInteger itemsToKeep;
{
for (int i = items.size(); --i >= 0;)
items.getUnchecked(i)->shouldKeep = false;
}
{
TreeViewItem* item = owner.rootItem;
@ -216,66 +218,56 @@ public:
if (y >= visibleTop)
{
const int index = rowComponentIds.indexOf (item->uid);
RowItem* const ri = findItem (item->uid);
if (index < 0)
if (ri != 0)
{
ri->shouldKeep = true;
}
else
{
Component* const comp = item->createItemComponent();
if (comp != 0)
{
items.add (new RowItem (item, comp, item->uid));
addAndMakeVisible (comp);
itemsToKeep.setBit (rowComponentItems.size());
rowComponentItems.add (item);
rowComponentIds.add (item->uid);
rowComponents.add (comp);
}
}
else
{
itemsToKeep.setBit (index);
}
}
item = item->getNextVisibleItem (true);
}
}
for (int i = rowComponentItems.size(); --i >= 0;)
for (int i = items.size(); --i >= 0;)
{
Component* const comp = rowComponents.getUnchecked(i);
RowItem* const ri = items.getUnchecked(i);
bool keep = false;
if (isParentOf (comp))
if (isParentOf (ri->component))
{
if (itemsToKeep[i])
if (ri->shouldKeep)
{
const TreeViewItem* const item = rowComponentItems.getUnchecked(i);
Rectangle<int> pos (item->getItemPosition (false));
pos.setSize (pos.getWidth(), item->itemHeight);
Rectangle<int> pos (ri->item->getItemPosition (false));
pos.setSize (pos.getWidth(), ri->item->itemHeight);
if (pos.getBottom() >= visibleTop && pos.getY() < visibleBottom)
{
keep = true;
comp->setBounds (pos);
ri->component->setBounds (pos);
}
}
if ((! keep) && isMouseDraggingInChildCompOf (comp))
if ((! keep) && isMouseDraggingInChildCompOf (ri->component))
{
keep = true;
comp->setSize (0, 0);
ri->component->setSize (0, 0);
}
}
if (! keep)
{
delete comp;
rowComponents.remove (i);
rowComponentIds.remove (i);
rowComponentItems.remove (i);
}
items.remove (i);
}
}
@ -341,9 +333,27 @@ public:
private:
TreeView& owner;
Array <TreeViewItem*> rowComponentItems;
Array <int> rowComponentIds;
Array <Component*> rowComponents;
struct RowItem
{
RowItem (TreeViewItem* const item_, Component* const component_, const int itemUID)
: component (component_), item (item_), uid (itemUID), shouldKeep (true)
{
}
~RowItem()
{
component.deleteAndZero();
}
Component::SafePointer<Component> component;
TreeViewItem* item;
int uid;
bool shouldKeep;
};
OwnedArray <RowItem> items;
TreeViewItem* buttonUnderMouse;
bool isDragging, needSelectionOnMouseUp;
@ -377,15 +387,27 @@ private:
}
}
bool containsItem (TreeViewItem* const item) const
bool containsItem (TreeViewItem* const item) const throw()
{
for (int i = rowComponentItems.size(); --i >= 0;)
if (rowComponentItems.getUnchecked(i) == item)
for (int i = items.size(); --i >= 0;)
if (items.getUnchecked(i)->item == item)
return true;
return false;
}
RowItem* findItem (const int uid) const throw()
{
for (int i = items.size(); --i >= 0;)
{
RowItem* const ri = items.getUnchecked(i);
if (ri->uid == uid)
return ri;
}
return 0;
}
static bool isMouseDraggingInChildCompOf (Component* const comp)
{
for (int i = Desktop::getInstance().getNumMouseSources(); --i >= 0;)
@ -856,8 +878,6 @@ public:
setInterceptsMouseClicks (false, false);
}
~InsertPointHighlight() {}
void setTargetPosition (TreeViewItem* const item, int insertIndex, const int x, const int y, const int width) throw()
{
lastItem = item;
@ -896,8 +916,6 @@ public:
setInterceptsMouseClicks (false, false);
}
~TargetGroupHighlight() {}
void setTargetPosition (TreeViewItem* const item) throw()
{
Rectangle<int> r (item->getItemPosition (true));
@ -1217,7 +1235,6 @@ void TreeViewItem::setOpen (const bool shouldBeOpen)
{
openness = shouldBeOpen ? opennessOpen
: opennessClosed;
treeHasChanged();
itemOpennessChanged (isOpen());
@ -1530,21 +1547,19 @@ void TreeViewItem::paintRecursively (Graphics& g, int width)
bool TreeViewItem::isLastOfSiblings() const throw()
{
return parentItem == 0
|| parentItem->subItems.getLast() == this;
|| parentItem->subItems.getLast() == this;
}
int TreeViewItem::getIndexInParent() const throw()
{
if (parentItem == 0)
return 0;
return parentItem->subItems.indexOf (this);
return parentItem == 0 ? 0
: parentItem->subItems.indexOf (this);
}
TreeViewItem* TreeViewItem::getTopLevelItem() throw()
{
return (parentItem == 0) ? this
: parentItem->getTopLevelItem();
return parentItem == 0 ? this
: parentItem->getTopLevelItem();
}
int TreeViewItem::getNumRows() const throw()
@ -1618,10 +1633,7 @@ TreeViewItem* TreeViewItem::findItemRecursively (int targetY) throw()
int TreeViewItem::countSelectedItemsRecursively() const throw()
{
int total = 0;
if (isSelected())
++total;
int total = isSelected() ? 1 : 0;
for (int i = subItems.size(); --i >= 0;)
total += subItems.getUnchecked(i)->countSelectedItemsRecursively();

View file

@ -45,6 +45,8 @@ FileBrowserComponent::FileBrowserComponent (int flags_,
fileFilter (fileFilter_),
flags (flags_),
previewComp (previewComp_),
currentPathBox ("path"),
fileLabel ("f", TRANS ("file:")),
thread ("Juce FileBrowser")
{
// You need to specify one or other of the open/save flags..
@ -76,29 +78,29 @@ FileBrowserComponent::FileBrowserComponent (int flags_,
if ((flags & useTreeView) != 0)
{
FileTreeComponent* const tree = new FileTreeComponent (*fileList);
fileListComponent = tree;
if ((flags & canSelectMultipleItems) != 0)
tree->setMultiSelectEnabled (true);
addAndMakeVisible (tree);
fileListComponent = tree;
}
else
{
FileListComponent* const list = new FileListComponent (*fileList);
fileListComponent = list;
list->setOutlineThickness (1);
if ((flags & canSelectMultipleItems) != 0)
list->setMultipleSelectionEnabled (true);
addAndMakeVisible (list);
fileListComponent = list;
}
fileListComponent->addListener (this);
addAndMakeVisible (currentPathBox = new ComboBox ("path"));
currentPathBox->setEditableText (true);
addAndMakeVisible (&currentPathBox);
currentPathBox.setEditableText (true);
StringArray rootNames, rootPaths;
const BigInteger separators (getRoots (rootNames, rootPaths));
@ -106,28 +108,25 @@ FileBrowserComponent::FileBrowserComponent (int flags_,
for (int i = 0; i < rootNames.size(); ++i)
{
if (separators [i])
currentPathBox->addSeparator();
currentPathBox.addSeparator();
currentPathBox->addItem (rootNames[i], i + 1);
currentPathBox.addItem (rootNames[i], i + 1);
}
currentPathBox->addSeparator();
currentPathBox->addListener (this);
currentPathBox.addSeparator();
currentPathBox.addListener (this);
addAndMakeVisible (filenameBox = new TextEditor());
filenameBox->setMultiLine (false);
filenameBox->setSelectAllWhenFocused (true);
filenameBox->setText (filename, false);
addAndMakeVisible (&filenameBox);
filenameBox.setMultiLine (false);
filenameBox.setSelectAllWhenFocused (true);
filenameBox.setText (filename, false);
filenameBox.addListener (this);
filenameBox.setReadOnly ((flags & (filenameBoxIsReadOnly | canSelectMultipleItems)) != 0);
filenameBox->addListener (this);
filenameBox->setReadOnly ((flags & (filenameBoxIsReadOnly | canSelectMultipleItems)) != 0);
Label* label = new Label ("f", TRANS("file:"));
addAndMakeVisible (label);
label->attachToComponent (filenameBox, true);
addAndMakeVisible (&fileLabel);
fileLabel.attachToComponent (&filenameBox, true);
addAndMakeVisible (goUpButton = getLookAndFeel().createFileBrowserGoUpButton());
goUpButton->addButtonListener (this);
goUpButton->setTooltip (TRANS ("go up to parent directory"));
@ -141,10 +140,6 @@ FileBrowserComponent::FileBrowserComponent (int flags_,
FileBrowserComponent::~FileBrowserComponent()
{
if (previewComp != 0)
removeChildComponent (previewComp);
deleteAllChildren();
fileList = 0;
thread.stopThread (10000);
}
@ -176,11 +171,11 @@ int FileBrowserComponent::getNumSelectedFiles() const throw()
const File FileBrowserComponent::getSelectedFile (int index) const throw()
{
if ((flags & canSelectDirectories) != 0 && filenameBox->getText().isEmpty())
if ((flags & canSelectDirectories) != 0 && filenameBox.getText().isEmpty())
return currentRoot;
if (! filenameBox->isReadOnly())
return currentRoot.getChildFile (filenameBox->getText());
if (! filenameBox.isReadOnly())
return currentRoot.getChildFile (filenameBox.getText());
return chosenFiles[index];
}
@ -206,8 +201,7 @@ void FileBrowserComponent::deselectAllFiles()
//==============================================================================
bool FileBrowserComponent::isFileSuitable (const File& file) const
{
return (flags & canSelectFiles) != 0 ? (fileFilter == 0 || fileFilter->isFileSuitable (file))
: false;
return (flags & canSelectFiles) != 0 && (fileFilter == 0 || fileFilter->isFileSuitable (file));
}
bool FileBrowserComponent::isDirectorySuitable (const File&) const
@ -221,7 +215,7 @@ bool FileBrowserComponent::isFileOrDirSuitable (const File& f) const
return (flags & canSelectDirectories) != 0 && (fileFilter == 0 || fileFilter->isDirectorySuitable (f));
return (flags & canSelectFiles) != 0 && f.exists()
&& (fileFilter == 0 || fileFilter->isFileSuitable (f));
&& (fileFilter == 0 || fileFilter->isFileSuitable (f));
}
//==============================================================================
@ -248,9 +242,9 @@ void FileBrowserComponent::setRoot (const File& newRootDirectory)
{
bool alreadyListed = false;
for (int i = currentPathBox->getNumItems(); --i >= 0;)
for (int i = currentPathBox.getNumItems(); --i >= 0;)
{
if (currentPathBox->getItemText (i).equalsIgnoreCase (path))
if (currentPathBox.getItemText (i).equalsIgnoreCase (path))
{
alreadyListed = true;
break;
@ -258,7 +252,7 @@ void FileBrowserComponent::setRoot (const File& newRootDirectory)
}
if (! alreadyListed)
currentPathBox->addItem (path, currentPathBox->getNumItems() + 2);
currentPathBox.addItem (path, currentPathBox.getNumItems() + 2);
}
}
@ -269,7 +263,7 @@ void FileBrowserComponent::setRoot (const File& newRootDirectory)
if (currentRootName.isEmpty())
currentRootName = File::separatorString;
currentPathBox->setText (currentRootName, true);
currentPathBox.setText (currentRootName, true);
goUpButton->setEnabled (currentRoot.getParentDirectory().isDirectory()
&& currentRoot.getParentDirectory() != currentRoot);
@ -299,9 +293,8 @@ FilePreviewComponent* FileBrowserComponent::getPreviewComponent() const throw()
void FileBrowserComponent::resized()
{
getLookAndFeel()
.layoutFileBrowserComponent (*this, fileListComponent,
previewComp, currentPathBox,
filenameBox, goUpButton);
.layoutFileBrowserComponent (*this, fileListComponent, previewComp,
&currentPathBox, &filenameBox, goUpButton);
}
//==============================================================================
@ -341,7 +334,7 @@ void FileBrowserComponent::selectionChanged()
}
if (newFilenames.size() > 0)
filenameBox->setText (newFilenames.joinIntoString (", "), false);
filenameBox.setText (newFilenames.joinIntoString (", "), false);
sendListenerChangeMessage();
}
@ -359,7 +352,7 @@ void FileBrowserComponent::fileDoubleClicked (const File& f)
setRoot (f);
if ((flags & canSelectDirectories) != 0)
filenameBox->setText (String::empty);
filenameBox.setText (String::empty);
}
else
{
@ -393,22 +386,22 @@ void FileBrowserComponent::textEditorTextChanged (TextEditor&)
void FileBrowserComponent::textEditorReturnKeyPressed (TextEditor&)
{
if (filenameBox->getText().containsChar (File::separator))
if (filenameBox.getText().containsChar (File::separator))
{
const File f (currentRoot.getChildFile (filenameBox->getText()));
const File f (currentRoot.getChildFile (filenameBox.getText()));
if (f.isDirectory())
{
setRoot (f);
chosenFiles.clear();
filenameBox->setText (String::empty);
filenameBox.setText (String::empty);
}
else
{
setRoot (f.getParentDirectory());
chosenFiles.clear();
chosenFiles.add (f);
filenameBox->setText (f.getFileName());
filenameBox.setText (f.getFileName());
}
}
else
@ -436,11 +429,11 @@ void FileBrowserComponent::buttonClicked (Button*)
void FileBrowserComponent::comboBoxChanged (ComboBox*)
{
const String newText (currentPathBox->getText().trim().unquoted());
const String newText (currentPathBox.getText().trim().unquoted());
if (newText.isNotEmpty())
{
const int index = currentPathBox->getSelectedId() - 1;
const int index = currentPathBox.getSelectedId() - 1;
StringArray rootNames, rootPaths;
getRoots (rootNames, rootPaths);
@ -493,7 +486,7 @@ const BigInteger FileBrowserComponent::getRoots (StringArray& rootNames, StringA
if (volume.isEmpty())
volume = TRANS("Hard Drive");
name << " [" << drive.getVolumeLabel() << ']';
name << " [" << volume << ']';
}
else if (drive.isOnCDRomDrive())
{

View file

@ -219,11 +219,12 @@ private:
Array<File> chosenFiles;
ListenerList <FileBrowserListener> listeners;
DirectoryContentsDisplayComponent* fileListComponent;
ScopedPointer<DirectoryContentsDisplayComponent> fileListComponent;
FilePreviewComponent* previewComp;
ComboBox* currentPathBox;
TextEditor* filenameBox;
Button* goUpButton;
ComboBox currentPathBox;
TextEditor filenameBox;
Label fileLabel;
ScopedPointer<Button> goUpButton;
TimeSliceThread thread;

View file

@ -36,25 +36,31 @@ BEGIN_JUCE_NAMESPACE
//==============================================================================
FileSearchPathListComponent::FileSearchPathListComponent()
: addButton ("+"),
removeButton ("-"),
changeButton (TRANS ("change...")),
upButton (String::empty, DrawableButton::ImageOnButtonBackground),
downButton (String::empty, DrawableButton::ImageOnButtonBackground)
{
addAndMakeVisible (listBox = new ListBox (String::empty, this));
listBox->setColour (ListBox::backgroundColourId, Colours::black.withAlpha (0.02f));
listBox->setColour (ListBox::outlineColourId, Colours::black.withAlpha (0.1f));
listBox->setOutlineThickness (1);
listBox.setModel (this);
addAndMakeVisible (&listBox);
listBox.setColour (ListBox::backgroundColourId, Colours::black.withAlpha (0.02f));
listBox.setColour (ListBox::outlineColourId, Colours::black.withAlpha (0.1f));
listBox.setOutlineThickness (1);
addAndMakeVisible (addButton = new TextButton ("+"));
addButton->addButtonListener (this);
addButton->setConnectedEdges (Button::ConnectedOnLeft | Button::ConnectedOnRight | Button::ConnectedOnBottom | Button::ConnectedOnTop);
addAndMakeVisible (&addButton);
addButton.addButtonListener (this);
addButton.setConnectedEdges (Button::ConnectedOnLeft | Button::ConnectedOnRight | Button::ConnectedOnBottom | Button::ConnectedOnTop);
addAndMakeVisible (removeButton = new TextButton ("-"));
removeButton->addButtonListener (this);
removeButton->setConnectedEdges (Button::ConnectedOnLeft | Button::ConnectedOnRight | Button::ConnectedOnBottom | Button::ConnectedOnTop);
addAndMakeVisible (&removeButton);
removeButton.addButtonListener (this);
removeButton.setConnectedEdges (Button::ConnectedOnLeft | Button::ConnectedOnRight | Button::ConnectedOnBottom | Button::ConnectedOnTop);
addAndMakeVisible (changeButton = new TextButton (TRANS("change...")));
changeButton->addButtonListener (this);
addAndMakeVisible (&changeButton);
changeButton.addButtonListener (this);
addAndMakeVisible (upButton = new DrawableButton (String::empty, DrawableButton::ImageOnButtonBackground));
upButton->addButtonListener (this);
addAndMakeVisible (&upButton);
upButton.addButtonListener (this);
{
Path arrowPath;
@ -63,11 +69,11 @@ FileSearchPathListComponent::FileSearchPathListComponent()
arrowImage.setFill (Colours::black.withAlpha (0.4f));
arrowImage.setPath (arrowPath);
upButton->setImages (&arrowImage);
upButton.setImages (&arrowImage);
}
addAndMakeVisible (downButton = new DrawableButton (String::empty, DrawableButton::ImageOnButtonBackground));
downButton->addButtonListener (this);
addAndMakeVisible (&downButton);
downButton.addButtonListener (this);
{
Path arrowPath;
@ -76,7 +82,7 @@ FileSearchPathListComponent::FileSearchPathListComponent()
arrowImage.setFill (Colours::black.withAlpha (0.4f));
arrowImage.setPath (arrowPath);
downButton->setImages (&arrowImage);
downButton.setImages (&arrowImage);
}
updateButtons();
@ -84,23 +90,22 @@ FileSearchPathListComponent::FileSearchPathListComponent()
FileSearchPathListComponent::~FileSearchPathListComponent()
{
deleteAllChildren();
}
void FileSearchPathListComponent::updateButtons()
{
const bool anythingSelected = listBox->getNumSelectedRows() > 0;
const bool anythingSelected = listBox.getNumSelectedRows() > 0;
removeButton->setEnabled (anythingSelected);
changeButton->setEnabled (anythingSelected);
upButton->setEnabled (anythingSelected);
downButton->setEnabled (anythingSelected);
removeButton.setEnabled (anythingSelected);
changeButton.setEnabled (anythingSelected);
upButton.setEnabled (anythingSelected);
downButton.setEnabled (anythingSelected);
}
void FileSearchPathListComponent::changed()
{
listBox->updateContent();
listBox->repaint();
listBox.updateContent();
listBox.repaint();
updateButtons();
}
@ -180,18 +185,18 @@ void FileSearchPathListComponent::resized()
{
const int buttonH = 22;
const int buttonY = getHeight() - buttonH - 4;
listBox->setBounds (2, 2, getWidth() - 4, buttonY - 5);
listBox.setBounds (2, 2, getWidth() - 4, buttonY - 5);
addButton->setBounds (2, buttonY, buttonH, buttonH);
removeButton->setBounds (addButton->getRight(), buttonY, buttonH, buttonH);
addButton.setBounds (2, buttonY, buttonH, buttonH);
removeButton.setBounds (addButton.getRight(), buttonY, buttonH, buttonH);
changeButton->changeWidthToFitText (buttonH);
downButton->setSize (buttonH * 2, buttonH);
upButton->setSize (buttonH * 2, buttonH);
changeButton.changeWidthToFitText (buttonH);
downButton.setSize (buttonH * 2, buttonH);
upButton.setSize (buttonH * 2, buttonH);
downButton->setTopRightPosition (getWidth() - 2, buttonY);
upButton->setTopRightPosition (downButton->getX() - 4, buttonY);
changeButton->setTopRightPosition (upButton->getX() - 8, buttonY);
downButton.setTopRightPosition (getWidth() - 2, buttonY);
upButton.setTopRightPosition (downButton.getX() - 4, buttonY);
changeButton.setTopRightPosition (upButton.getX() - 8, buttonY);
}
bool FileSearchPathListComponent::isInterestedInFileDrag (const StringArray&)
@ -207,7 +212,7 @@ void FileSearchPathListComponent::filesDropped (const StringArray& filenames, in
if (f.isDirectory())
{
const int row = listBox->getRowContainingPosition (0, mouseY - listBox->getY());
const int row = listBox.getRowContainingPosition (0, mouseY - listBox.getY());
path.add (f, row);
changed();
}
@ -216,13 +221,13 @@ void FileSearchPathListComponent::filesDropped (const StringArray& filenames, in
void FileSearchPathListComponent::buttonClicked (Button* button)
{
const int currentRow = listBox->getSelectedRow();
const int currentRow = listBox.getSelectedRow();
if (button == removeButton)
if (button == &removeButton)
{
deleteKeyPressed (currentRow);
}
else if (button == addButton)
else if (button == &addButton)
{
File start (defaultBrowseTarget);
@ -239,28 +244,28 @@ void FileSearchPathListComponent::buttonClicked (Button* button)
path.add (chooser.getResult(), currentRow);
}
}
else if (button == changeButton)
else if (button == &changeButton)
{
returnKeyPressed (currentRow);
}
else if (button == upButton)
else if (button == &upButton)
{
if (currentRow > 0 && currentRow < path.getNumPaths())
{
const File f (path[currentRow]);
path.remove (currentRow);
path.add (f, currentRow - 1);
listBox->selectRow (currentRow - 1);
listBox.selectRow (currentRow - 1);
}
}
else if (button == downButton)
else if (button == &downButton)
{
if (currentRow >= 0 && currentRow < path.getNumPaths() - 1)
{
const File f (path[currentRow]);
path.remove (currentRow);
path.add (f, currentRow + 1);
listBox->selectRow (currentRow + 1);
listBox.selectRow (currentRow + 1);
}
}

View file

@ -48,9 +48,7 @@ class JUCE_API FileSearchPathListComponent : public Component,
{
public:
//==============================================================================
/** Creates an empty FileSearchPathListComponent.
*/
/** Creates an empty FileSearchPathListComponent. */
FileSearchPathListComponent();
/** Destructor. */
@ -114,12 +112,9 @@ private:
FileSearchPath path;
File defaultBrowseTarget;
ListBox* listBox;
Button* addButton;
Button* removeButton;
TextButton* changeButton;
DrawableButton* upButton;
DrawableButton* downButton;
ListBox listBox;
TextButton addButton, removeButton, changeButton;
DrawableButton upButton, downButton;
void changed();
void updateButtons();
@ -129,5 +124,4 @@ private:
};
#endif // __JUCE_FILESEARCHPATHLISTCOMPONENT_JUCEHEADER__

View file

@ -38,13 +38,12 @@ BEGIN_JUCE_NAMESPACE
#include "../lookandfeel/juce_LookAndFeel.h"
#include "../../../text/juce_LocalisedStrings.h"
const int maxKeys = 3;
//==============================================================================
class KeyMappingChangeButton : public Button
{
public:
KeyMappingChangeButton (KeyMappingEditorComponent* const owner_,
KeyMappingChangeButton (KeyMappingEditorComponent& owner_,
const CommandID commandID_,
const String& keyName,
const int keyNum_)
@ -56,14 +55,8 @@ public:
setWantsKeyboardFocus (false);
setTriggeredOnMouseDown (keyNum >= 0);
if (keyNum_ < 0)
setTooltip (TRANS("adds a new key-mapping"));
else
setTooltip (TRANS("click to change this key-mapping"));
}
~KeyMappingChangeButton()
{
setTooltip (keyNum_ < 0 ? TRANS("adds a new key-mapping")
: TRANS("click to change this key-mapping"));
}
void paintButton (Graphics& g, bool /*isOver*/, bool /*isDown*/)
@ -86,17 +79,17 @@ public:
if (res == 1)
{
owner->assignNewKey (commandID, keyNum);
owner.assignNewKey (commandID, keyNum);
}
else if (res == 2)
{
owner->getMappings()->removeKeyPress (commandID, keyNum);
owner.getMappings()->removeKeyPress (commandID, keyNum);
}
}
else
{
// + button pressed..
owner->assignNewKey (commandID, -1);
owner.assignNewKey (commandID, -1);
}
}
@ -116,7 +109,7 @@ public:
juce_UseDebuggingNewOperator
private:
KeyMappingEditorComponent* const owner;
KeyMappingEditorComponent& owner;
const CommandID commandID;
const int keyNum;
@ -128,32 +121,30 @@ private:
class KeyMappingItemComponent : public Component
{
public:
KeyMappingItemComponent (KeyMappingEditorComponent* const owner_,
const CommandID commandID_)
: owner (owner_),
commandID (commandID_)
KeyMappingItemComponent (KeyMappingEditorComponent& owner_, const CommandID commandID_)
: owner (owner_), commandID (commandID_)
{
setInterceptsMouseClicks (false, true);
const bool isReadOnly = owner_->isCommandReadOnly (commandID);
const bool isReadOnly = owner.isCommandReadOnly (commandID);
const Array <KeyPress> keyPresses (owner_->getMappings()->getKeyPressesAssignedToCommand (commandID));
const Array <KeyPress> keyPresses (owner.getMappings()->getKeyPressesAssignedToCommand (commandID));
for (int i = 0; i < jmin (maxKeys, keyPresses.size()); ++i)
for (int i = 0; i < jmin ((int) maxNumAssignments, keyPresses.size()); ++i)
{
KeyMappingChangeButton* const kb
= new KeyMappingChangeButton (owner_, commandID,
owner_->getDescriptionForKeyPress (keyPresses.getReference (i)), i);
= new KeyMappingChangeButton (owner, commandID,
owner.getDescriptionForKeyPress (keyPresses.getReference (i)), i);
kb->setEnabled (! isReadOnly);
addAndMakeVisible (kb);
}
KeyMappingChangeButton* const kb
= new KeyMappingChangeButton (owner_, commandID, String::empty, -1);
= new KeyMappingChangeButton (owner, commandID, String::empty, -1);
addChildComponent (kb);
kb->setVisible (keyPresses.size() < maxKeys && ! isReadOnly);
kb->setVisible (keyPresses.size() < (int) maxNumAssignments && ! isReadOnly);
}
~KeyMappingItemComponent()
@ -166,7 +157,7 @@ public:
g.setFont (getHeight() * 0.7f);
g.setColour (findColour (KeyMappingEditorComponent::textColourId));
g.drawFittedText (owner->getMappings()->getCommandManager()->getNameOfCommand (commandID),
g.drawFittedText (owner.getMappings()->getCommandManager()->getNameOfCommand (commandID),
4, 0, jmax (40, getChildComponent (0)->getX() - 5), getHeight(),
Justification::centredLeft, true);
}
@ -185,10 +176,12 @@ public:
}
}
enum { maxNumAssignments = 3 };
juce_UseDebuggingNewOperator
private:
KeyMappingEditorComponent* const owner;
KeyMappingEditorComponent& owner;
const CommandID commandID;
KeyMappingItemComponent (const KeyMappingItemComponent&);
@ -199,14 +192,8 @@ private:
class KeyMappingTreeViewItem : public TreeViewItem
{
public:
KeyMappingTreeViewItem (KeyMappingEditorComponent* const owner_,
const CommandID commandID_)
: owner (owner_),
commandID (commandID_)
{
}
~KeyMappingTreeViewItem()
KeyMappingTreeViewItem (KeyMappingEditorComponent& owner_, const CommandID commandID_)
: owner (owner_), commandID (commandID_)
{
}
@ -222,7 +209,7 @@ public:
juce_UseDebuggingNewOperator
private:
KeyMappingEditorComponent* const owner;
KeyMappingEditorComponent& owner;
const CommandID commandID;
KeyMappingTreeViewItem (const KeyMappingTreeViewItem&);
@ -234,14 +221,8 @@ private:
class KeyCategoryTreeViewItem : public TreeViewItem
{
public:
KeyCategoryTreeViewItem (KeyMappingEditorComponent* const owner_,
const String& name)
: owner (owner_),
categoryName (name)
{
}
~KeyCategoryTreeViewItem()
KeyCategoryTreeViewItem (KeyMappingEditorComponent& owner_, const String& name)
: owner (owner_), categoryName (name)
{
}
@ -252,7 +233,7 @@ public:
void paintItem (Graphics& g, int width, int height)
{
g.setFont (height * 0.6f, Font::bold);
g.setColour (owner->findColour (KeyMappingEditorComponent::textColourId));
g.setColour (owner.findColour (KeyMappingEditorComponent::textColourId));
g.drawText (categoryName,
2, 0, width - 2, height,
@ -265,11 +246,11 @@ public:
{
if (getNumSubItems() == 0)
{
Array <CommandID> commands (owner->getMappings()->getCommandManager()->getCommandsInCategory (categoryName));
Array <CommandID> commands (owner.getMappings()->getCommandManager()->getCommandsInCategory (categoryName));
for (int i = 0; i < commands.size(); ++i)
{
if (owner->shouldCommandBeIncluded (commands[i]))
if (owner.shouldCommandBeIncluded (commands[i]))
addSubItem (new KeyMappingTreeViewItem (owner, commands[i]));
}
}
@ -283,7 +264,7 @@ public:
juce_UseDebuggingNewOperator
private:
KeyMappingEditorComponent* owner;
KeyMappingEditorComponent& owner;
String categoryName;
KeyCategoryTreeViewItem (const KeyCategoryTreeViewItem&);
@ -394,7 +375,7 @@ void KeyMappingEditorComponent::changeListenerCallback (void*)
++count;
if (count > 0)
addSubItem (new KeyCategoryTreeViewItem (this, categories[i]));
addSubItem (new KeyCategoryTreeViewItem (*this, categories[i]));
}
if (oldOpenness != 0)
@ -405,7 +386,7 @@ void KeyMappingEditorComponent::changeListenerCallback (void*)
class KeyEntryWindow : public AlertWindow
{
public:
KeyEntryWindow (KeyMappingEditorComponent* const owner_)
KeyEntryWindow (KeyMappingEditorComponent& owner_)
: AlertWindow (TRANS("New key-mapping"),
TRANS("Please press a key combination now..."),
AlertWindow::NoIcon),
@ -429,15 +410,15 @@ public:
bool keyPressed (const KeyPress& key)
{
lastPress = key;
String message (TRANS("Key: ") + owner->getDescriptionForKeyPress (key));
String message (TRANS("Key: ") + owner.getDescriptionForKeyPress (key));
const CommandID previousCommand = owner->getMappings()->findCommandForKeyPress (key);
const CommandID previousCommand = owner.getMappings()->findCommandForKeyPress (key);
if (previousCommand != 0)
{
message << "\n\n"
<< TRANS("(Currently assigned to \"")
<< owner->getMappings()->getCommandManager()->getNameOfCommand (previousCommand)
<< owner.getMappings()->getCommandManager()->getNameOfCommand (previousCommand)
<< "\")";
}
@ -456,7 +437,7 @@ public:
juce_UseDebuggingNewOperator
private:
KeyMappingEditorComponent* owner;
KeyMappingEditorComponent& owner;
KeyEntryWindow (const KeyEntryWindow&);
KeyEntryWindow& operator= (const KeyEntryWindow&);
@ -465,7 +446,7 @@ private:
void KeyMappingEditorComponent::assignNewKey (const CommandID commandID, const int index)
{
KeyEntryWindow entryWindow (this);
KeyEntryWindow entryWindow (*this);
if (entryWindow.runModalLoop() != 0)
{

View file

@ -44,10 +44,6 @@ public:
setRange (0.0, 255.0, 1.0);
}
~ColourComponentSlider()
{
}
const String getTextFromValue (double value)
{
return String::toHexString ((int) value).toUpperCase().paddedLeft ('0', 2);
@ -72,10 +68,6 @@ public:
setInterceptsMouseClicks (false, false);
}
~ColourSpaceMarker()
{
}
void paint (Graphics& g)
{
g.setColour (Colour::greyLevel (0.1f));
@ -93,7 +85,7 @@ private:
class ColourSelector::ColourSpaceView : public Component
{
public:
ColourSpaceView (ColourSelector* owner_,
ColourSpaceView (ColourSelector& owner_,
float& h_, float& s_, float& v_,
const int edgeSize)
: owner (owner_),
@ -105,10 +97,6 @@ public:
setMouseCursor (MouseCursor::CrosshairCursor);
}
~ColourSpaceView()
{
}
void paint (Graphics& g)
{
if (colours.isNull())
@ -147,7 +135,7 @@ public:
const float sat = (e.x - edge) / (float) (getWidth() - edge * 2);
const float val = 1.0f - (e.y - edge) / (float) (getHeight() - edge * 2);
owner->setSV (sat, val);
owner.setSV (sat, val);
}
void updateIfNeeded()
@ -169,7 +157,7 @@ public:
}
private:
ColourSelector* const owner;
ColourSelector& owner;
float& h;
float& s;
float& v;
@ -198,10 +186,6 @@ public:
setInterceptsMouseClicks (false, false);
}
~HueSelectorMarker()
{
}
void paint (Graphics& g)
{
Path p;
@ -229,7 +213,7 @@ private:
class ColourSelector::HueSelectorComp : public Component
{
public:
HueSelectorComp (ColourSelector* owner_,
HueSelectorComp (ColourSelector& owner_,
float& h_, float& s_, float& v_,
const int edgeSize)
: owner (owner_),
@ -240,10 +224,6 @@ public:
addAndMakeVisible (&marker);
}
~HueSelectorComp()
{
}
void paint (Graphics& g)
{
const float yScale = 1.0f / (getHeight() - edge * 2);
@ -272,7 +252,7 @@ public:
{
const float hue = (e.y - edge) / (float) (getHeight() - edge * 2);
owner->setHue (hue);
owner.setHue (hue);
}
void updateIfNeeded()
@ -281,7 +261,7 @@ public:
}
private:
ColourSelector* const owner;
ColourSelector& owner;
float& h;
float& s;
float& v;
@ -297,19 +277,14 @@ private:
class ColourSelector::SwatchComponent : public Component
{
public:
SwatchComponent (ColourSelector* owner_, int index_)
: owner (owner_),
index (index_)
{
}
~SwatchComponent()
SwatchComponent (ColourSelector& owner_, int index_)
: owner (owner_), index (index_)
{
}
void paint (Graphics& g)
{
const Colour colour (owner->getSwatchColour (index));
const Colour colour (owner.getSwatchColour (index));
g.fillCheckerBoard (getLocalBounds(), 6, 6,
Colour (0xffdddddd).overlaidWith (colour),
@ -327,20 +302,20 @@ public:
if (r == 1)
{
owner->setCurrentColour (owner->getSwatchColour (index));
owner.setCurrentColour (owner.getSwatchColour (index));
}
else if (r == 2)
{
if (owner->getSwatchColour (index) != owner->getCurrentColour())
if (owner.getSwatchColour (index) != owner.getCurrentColour())
{
owner->setSwatchColour (index, owner->getCurrentColour());
owner.setSwatchColour (index, owner.getCurrentColour());
repaint();
}
}
}
private:
ColourSelector* const owner;
ColourSelector& owner;
const int index;
SwatchComponent (const SwatchComponent&);
@ -381,8 +356,8 @@ ColourSelector::ColourSelector (const int flags_,
if ((flags & showColourspace) != 0)
{
addAndMakeVisible (colourSpace = new ColourSpaceView (this, h, s, v, gapAroundColourSpaceComponent));
addAndMakeVisible (hueSelector = new HueSelectorComp (this, h, s, v, gapAroundColourSpaceComponent));
addAndMakeVisible (colourSpace = new ColourSpaceView (*this, h, s, v, gapAroundColourSpaceComponent));
addAndMakeVisible (hueSelector = new HueSelectorComp (*this, h, s, v, gapAroundColourSpaceComponent));
}
update();
@ -561,7 +536,7 @@ void ColourSelector::resized()
for (int i = 0; i < numSwatches; ++i)
{
SwatchComponent* const sc = new SwatchComponent (this, i);
SwatchComponent* const sc = new SwatchComponent (*this, i);
swatchComponents.add (sc);
addAndMakeVisible (sc);
}

View file

@ -34,8 +34,7 @@ BEGIN_JUCE_NAMESPACE
class MidiKeyboardUpDownButton : public Button
{
public:
MidiKeyboardUpDownButton (MidiKeyboardComponent* const owner_,
const int delta_)
MidiKeyboardUpDownButton (MidiKeyboardComponent& owner_, const int delta_)
: Button (String::empty),
owner (owner_),
delta (delta_)
@ -43,33 +42,27 @@ public:
setOpaque (true);
}
~MidiKeyboardUpDownButton()
{
}
void clicked()
{
int note = owner->getLowestVisibleKey();
int note = owner.getLowestVisibleKey();
if (delta < 0)
note = (note - 1) / 12;
else
note = note / 12 + 1;
owner->setLowestVisibleKey (note * 12);
owner.setLowestVisibleKey (note * 12);
}
void paintButton (Graphics& g,
bool isMouseOverButton,
bool isButtonDown)
void paintButton (Graphics& g, bool isMouseOverButton, bool isButtonDown)
{
owner->drawUpDownButton (g, getWidth(), getHeight(),
isMouseOverButton, isButtonDown,
delta > 0);
owner.drawUpDownButton (g, getWidth(), getHeight(),
isMouseOverButton, isButtonDown,
delta > 0);
}
private:
MidiKeyboardComponent* const owner;
MidiKeyboardComponent& owner;
const int delta;
MidiKeyboardUpDownButton (const MidiKeyboardUpDownButton&);
@ -98,8 +91,8 @@ MidiKeyboardComponent::MidiKeyboardComponent (MidiKeyboardState& state_,
keyMappingOctave (6),
octaveNumForMiddleC (3)
{
addChildComponent (scrollDown = new MidiKeyboardUpDownButton (this, -1));
addChildComponent (scrollUp = new MidiKeyboardUpDownButton (this, 1));
addChildComponent (scrollDown = new MidiKeyboardUpDownButton (*this, -1));
addChildComponent (scrollUp = new MidiKeyboardUpDownButton (*this, 1));
// initialise with a default set of querty key-mappings..
const char* const keymap = "awsedftgyhujkolp;";
@ -117,8 +110,6 @@ MidiKeyboardComponent::~MidiKeyboardComponent()
{
state.removeListener (this);
jassert (mouseDownNote < 0 && keysPressed.countNumberOfSetBits() == 0); // leaving stuck notes!
deleteAllChildren();
}
//==============================================================================

View file

@ -396,8 +396,7 @@ private:
int rangeStart, rangeEnd, firstKey;
bool canScroll, mouseDragging, useMousePositionForVelocity;
Button* scrollDown;
Button* scrollUp;
ScopedPointer<Button> scrollDown, scrollUp;
Array <KeyPress> keyPresses;
Array <int> keyPressNotes;

View file

@ -28,7 +28,6 @@
BEGIN_JUCE_NAMESPACE
#include "juce_PreferencesPanel.h"
#include "../buttons/juce_DrawableButton.h"
#include "../windows/juce_DialogWindow.h"
#include "../../graphics/imaging/juce_ImageCache.h"
#include "../../graphics/drawables/juce_DrawableImage.h"
@ -42,8 +41,6 @@ PreferencesPanel::PreferencesPanel()
PreferencesPanel::~PreferencesPanel()
{
currentPage = 0;
deleteAllChildren();
}
//==============================================================================
@ -52,7 +49,9 @@ void PreferencesPanel::addSettingsPage (const String& title,
const Drawable* overIcon,
const Drawable* downIcon)
{
DrawableButton* button = new DrawableButton (title, DrawableButton::ImageAboveTextLabel);
DrawableButton* const button = new DrawableButton (title, DrawableButton::ImageAboveTextLabel);
buttons.add (button);
button->setImages (icon, overIcon, downIcon);
button->setRadioGroupId (1);
button->addButtonListener (this);
@ -66,9 +65,7 @@ void PreferencesPanel::addSettingsPage (const String& title,
setCurrentPage (title);
}
void PreferencesPanel::addSettingsPage (const String& title,
const void* imageData,
const int imageDataSize)
void PreferencesPanel::addSettingsPage (const String& title, const void* imageData, const int imageDataSize)
{
DrawableImage icon, iconOver, iconDown;
icon.setImage (ImageCache::getFromMemory (imageData, imageDataSize));
@ -83,64 +80,20 @@ void PreferencesPanel::addSettingsPage (const String& title,
}
//==============================================================================
class PrefsDialogWindow : public DialogWindow
{
public:
PrefsDialogWindow (const String& dialogtitle,
const Colour& backgroundColour)
: DialogWindow (dialogtitle, backgroundColour, true)
{
}
~PrefsDialogWindow()
{
}
void closeButtonPressed()
{
exitModalState (0);
}
private:
PrefsDialogWindow (const PrefsDialogWindow&);
PrefsDialogWindow& operator= (const PrefsDialogWindow&);
};
//==============================================================================
void PreferencesPanel::showInDialogBox (const String& dialogtitle,
int dialogWidth,
int dialogHeight,
const Colour& backgroundColour)
void PreferencesPanel::showInDialogBox (const String& dialogTitle, int dialogWidth, int dialogHeight, const Colour& backgroundColour)
{
setSize (dialogWidth, dialogHeight);
PrefsDialogWindow dw (dialogtitle, backgroundColour);
dw.setContentComponent (this, true, true);
dw.centreAroundComponent (0, dw.getWidth(), dw.getHeight());
dw.runModalLoop();
dw.setContentComponent (0, false, false);
DialogWindow::showModalDialog (dialogTitle, this, 0, backgroundColour, false);
}
//==============================================================================
void PreferencesPanel::resized()
{
int x = 0;
for (int i = 0; i < buttons.size(); ++i)
buttons.getUnchecked(i)->setBounds (i * buttonSize, 0, buttonSize, buttonSize);
for (int i = 0; i < getNumChildComponents(); ++i)
{
Component* c = getChildComponent (i);
if (dynamic_cast <DrawableButton*> (c) == 0)
{
c->setBounds (0, buttonSize + 5, getWidth(), getHeight() - buttonSize - 5);
}
else
{
c->setBounds (x, 0, buttonSize, buttonSize);
x += buttonSize;
}
}
if (currentPage != 0)
currentPage->setBounds (getLocalBounds().withTop (buttonSize + 5));
}
void PreferencesPanel::paint (Graphics& g)
@ -165,13 +118,11 @@ void PreferencesPanel::setCurrentPage (const String& pageName)
resized();
}
for (int i = 0; i < getNumChildComponents(); ++i)
for (int i = 0; i < buttons.size(); ++i)
{
DrawableButton* db = dynamic_cast <DrawableButton*> (getChildComponent (i));
if (db != 0 && db->getName() == pageName)
if (buttons.getUnchecked(i)->getName() == pageName)
{
db->setToggleState (true, false);
buttons.getUnchecked(i)->setToggleState (true, false);
break;
}
}
@ -180,13 +131,11 @@ void PreferencesPanel::setCurrentPage (const String& pageName)
void PreferencesPanel::buttonClicked (Button*)
{
for (int i = 0; i < getNumChildComponents(); ++i)
for (int i = 0; i < buttons.size(); ++i)
{
DrawableButton* db = dynamic_cast <DrawableButton*> (getChildComponent (i));
if (db != 0 && db->getToggleState())
if (buttons.getUnchecked(i)->getToggleState())
{
setCurrentPage (db->getName());
setCurrentPage (buttons.getUnchecked(i)->getName());
break;
}
}

View file

@ -27,7 +27,7 @@
#define __JUCE_PREFERENCESPANEL_JUCEHEADER__
#include "../juce_Component.h"
#include "../buttons/juce_Button.h"
#include "../buttons/juce_DrawableButton.h"
#include "../../graphics/drawables/juce_Drawable.h"
@ -104,7 +104,7 @@ public:
given size and title, and will run it modally, returning when the user
closes the dialog box.
*/
void showInDialogBox (const String& dialogtitle,
void showInDialogBox (const String& dialogTitle,
int dialogWidth,
int dialogHeight,
const Colour& backgroundColour = Colours::white);
@ -138,6 +138,7 @@ private:
//==============================================================================
String currentPageName;
ScopedPointer <Component> currentPage;
OwnedArray<DrawableButton> buttons;
int buttonSize;
PreferencesPanel (const PreferencesPanel&);

View file

@ -203,6 +203,7 @@ public:
/** Moves the x position, adjusting the width so that the right-hand edge remains in the same place.
If the x is moved to be on the right of the current right-hand edge, the width will be set to zero.
@see withLeft
*/
void setLeft (const ValueType newLeft) throw()
{
@ -210,8 +211,15 @@ public:
x = newLeft;
}
/** Returns a new rectangle with a different x position, but the same right-hand edge as this one.
If the new x is beyond the right of the current right-hand edge, the width will be set to zero.
@see setLeft
*/
const Rectangle withLeft (const ValueType newLeft) const throw() { return Rectangle (newLeft, y, jmax (ValueType(), x + w - newLeft), h); }
/** Moves the y position, adjusting the height so that the bottom edge remains in the same place.
If the y is moved to be below the current bottom edge, the height will be set to zero.
@see withTop
*/
void setTop (const ValueType newTop) throw()
{
@ -219,9 +227,15 @@ public:
y = newTop;
}
/** Returns a new rectangle with a different y position, but the same bottom edge as this one.
If the new y is beyond the bottom of the current rectangle, the height will be set to zero.
@see setTop
*/
const Rectangle withTop (const ValueType newTop) const throw() { return Rectangle (x, newTop, w, jmax (ValueType(), y + h - newTop)); }
/** Adjusts the width so that the right-hand edge of the rectangle has this new value.
If the new right is below the current X value, the X will be pushed down to match it.
@see getRight
@see getRight, withRight
*/
void setRight (const ValueType newRight) throw()
{
@ -229,9 +243,15 @@ public:
w = newRight - x;
}
/** Returns a new rectangle with a different right-hand edge position, but the same left-hand edge as this one.
If the new right edge is below the current left-hand edge, the width will be set to zero.
@see setRight
*/
const Rectangle withRight (const ValueType newRight) const throw() { return Rectangle (jmin (x, newRight), y, jmax (ValueType(), newRight - x), h); }
/** Adjusts the height so that the bottom edge of the rectangle has this new value.
If the new bottom is lower than the current Y value, the Y will be pushed down to match it.
@see getBottom
@see getBottom, withBottom
*/
void setBottom (const ValueType newBottom) throw()
{
@ -239,6 +259,12 @@ public:
h = newBottom - y;
}
/** Returns a new rectangle with a different bottom edge position, but the same top edge as this one.
If the new y is beyond the bottom of the current rectangle, the height will be set to zero.
@see setBottom
*/
const Rectangle withBottom (const ValueType newBottom) const throw() { return Rectangle (x, jmin (y, newBottom), w, jmax (ValueType(), newBottom - y)); }
//==============================================================================
/** Moves the rectangle's position by adding amount to its x and y co-ordinates. */
void translate (const ValueType deltaX,

View file

@ -62,7 +62,7 @@ public:
if (file_.inputSource != 0)
{
inputStream = file.inputSource->createInputStream();
inputStream = streamToDelete = file.inputSource->createInputStream();
}
else
{
@ -89,9 +89,6 @@ public:
if (inputStream != 0 && inputStream == file.inputStream)
file.numOpenStreams--;
#endif
if (inputStream != file.inputStream)
delete inputStream;
}
int64 getTotalLength()
@ -151,6 +148,7 @@ private:
int64 pos;
int headerSize;
InputStream* inputStream;
ScopedPointer<InputStream> streamToDelete;
ZipInputStream (const ZipInputStream&);
ZipInputStream& operator= (const ZipInputStream&);
@ -195,11 +193,11 @@ ZipFile::~ZipFile()
#if JUCE_DEBUG
entries.clear();
// If you hit this assertion, it means you've created a stream to read
// one of the items in the zipfile, but you've forgotten to delete that
// stream object before deleting the file.. Streams can't be kept open
// after the file is deleted because they need to share the input
// stream that the file uses to read itself.
/* If you hit this assertion, it means you've created a stream to read one of the items in the
zipfile, but you've forgotten to delete that stream object before deleting the file..
Streams can't be kept open after the file is deleted because they need to share the input
stream that the file uses to read itself.
*/
jassert (numOpenStreams == 0);
#endif
}

View file

@ -1072,7 +1072,11 @@ NSRect NSViewComponentPeer::constrainRect (NSRect r)
Rectangle<int> pos (convertToRectInt (r));
Rectangle<int> original (convertToRectInt (current));
#if defined (MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MIN_ALLOWED >= MAC_OS_X_VERSION_10_6
if ([window inLiveResize])
#else
if ([window performSelector: @selector (inLiveResize)])
#endif
{
constrainer->checkBounds (pos, original,
Desktop::getInstance().getAllMonitorDisplayAreas().getBounds(),

View file

@ -69,12 +69,12 @@ class UnitTestRunner;
@see UnitTestRunner
*/
class UnitTest
class JUCE_API UnitTest
{
public:
//==============================================================================
/** Creates a test with the given name. */
UnitTest (const String& name);
explicit UnitTest (const String& name);
/** Destructor. */
virtual ~UnitTest();
@ -184,7 +184,7 @@ private:
@see UnitTest
*/
class UnitTestRunner
class JUCE_API UnitTestRunner
{
public:
//==============================================================================