summaryrefslogtreecommitdiff
path: root/osframework/source/SexyAppFramework/Dialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'osframework/source/SexyAppFramework/Dialog.cpp')
-rw-r--r--osframework/source/SexyAppFramework/Dialog.cpp407
1 files changed, 407 insertions, 0 deletions
diff --git a/osframework/source/SexyAppFramework/Dialog.cpp b/osframework/source/SexyAppFramework/Dialog.cpp
new file mode 100644
index 0000000..0a273bd
--- /dev/null
+++ b/osframework/source/SexyAppFramework/Dialog.cpp
@@ -0,0 +1,407 @@
+#include "Common.h"
+#include "Dialog.h"
+#include "DialogButton.h"
+#include "SexyAppBase.h"
+#include "WidgetManager.h"
+#include "SysFont.h"
+#include "ImageFont.h"
+
+using namespace Sexy;
+
+
+SexyString Sexy::DIALOG_YES_STRING = _S("YES");
+SexyString Sexy::DIALOG_NO_STRING = _S("NO");
+SexyString Sexy::DIALOG_OK_STRING = _S("OK");
+SexyString Sexy::DIALOG_CANCEL_STRING = _S("CANCEL");
+
+static int gDialogColors[][3] =
+{{255, 255, 255},
+{255, 255, 0},
+{255, 255, 255},
+{255, 255, 255},
+{255, 255, 255},
+
+{80, 80, 80},
+{255, 255, 255}};
+
+Dialog::Dialog(Image* theComponentImage, Image* theButtonComponentImage, int theId, bool isModal, const SexyString& theDialogHeader, const SexyString& theDialogLines, const SexyString& theDialogFooter, int theButtonMode)
+{
+ mId = theId;
+ mResult = 0x7FFFFFFF;
+ mComponentImage = theComponentImage;
+ mIsModal = isModal;
+ mContentInsets = Insets(24, 24, 24, 24);
+ mTextAlign = 0;
+ mLineSpacingOffset = 0;
+ mSpaceAfterHeader = 10;
+ mButtonSidePadding = 0;
+ mButtonHorzSpacing = 8;
+ mDialogListener = gSexyAppBase;
+
+ mDialogHeader = theDialogHeader;
+ mDialogFooter = theDialogFooter;
+ mButtonMode = theButtonMode;
+
+ if ((mButtonMode == BUTTONS_YES_NO) || (mButtonMode == BUTTONS_OK_CANCEL))
+ {
+ mYesButton = new DialogButton(theButtonComponentImage, ID_YES, this);
+ mNoButton = new DialogButton(theButtonComponentImage, ID_NO, this);
+
+ if (mButtonMode == BUTTONS_YES_NO)
+ {
+ mYesButton->mLabel = DIALOG_YES_STRING;
+ mNoButton->mLabel = DIALOG_NO_STRING;
+ }
+ else
+ {
+ mYesButton->mLabel = DIALOG_OK_STRING;
+ mNoButton->mLabel = DIALOG_CANCEL_STRING;
+ }
+ }
+ else if (mButtonMode == BUTTONS_FOOTER)
+ {
+ mYesButton = new DialogButton(theButtonComponentImage, ID_FOOTER, this);
+ mYesButton->mLabel = mDialogFooter;
+ mNoButton = NULL;
+ }
+ else
+ {
+ mYesButton = NULL;
+ mNoButton = NULL;
+ mNumButtons = 0;
+ }
+
+ mDialogLines = theDialogLines;
+
+ mButtonHeight = (theButtonComponentImage == NULL) ? 24 : theButtonComponentImage->mHeight;
+
+ mHasTransparencies = true;
+ mHasAlpha = true;
+
+ mHeaderFont = NULL;
+ mLinesFont = NULL;
+
+ mDragging = false;
+ mPriority = 1;
+
+ if (theButtonComponentImage == NULL)
+ {
+ gDialogColors[COLOR_BUTTON_TEXT][0] = 0;
+ gDialogColors[COLOR_BUTTON_TEXT][1] = 0;
+ gDialogColors[COLOR_BUTTON_TEXT][2] = 0;
+ gDialogColors[COLOR_BUTTON_TEXT_HILITE][0] = 0;
+ gDialogColors[COLOR_BUTTON_TEXT_HILITE][1] = 0;
+ gDialogColors[COLOR_BUTTON_TEXT_HILITE][2] = 0;
+ }
+
+ SetColors(gDialogColors, NUM_COLORS);
+}
+
+
+Dialog::~Dialog()
+{
+ delete mYesButton;
+ delete mNoButton;
+
+ delete mHeaderFont;
+ delete mLinesFont;
+}
+
+void Dialog::SetColor(int theIdx, const Color& theColor)
+{
+ Widget::SetColor(theIdx, theColor);
+
+ if (theIdx == COLOR_BUTTON_TEXT)
+ {
+ if (mYesButton != NULL)
+ mYesButton->SetColor(DialogButton::COLOR_LABEL, theColor);
+ if (mNoButton != NULL)
+ mNoButton->SetColor(DialogButton::COLOR_LABEL, theColor);
+ }
+ else if (theIdx == COLOR_BUTTON_TEXT_HILITE)
+ {
+ if (mYesButton != NULL)
+ mYesButton->SetColor(DialogButton::COLOR_LABEL_HILITE, theColor);
+ if (mNoButton != NULL)
+ mNoButton->SetColor(DialogButton::COLOR_LABEL_HILITE, theColor);
+ }
+}
+
+void Dialog::SetButtonFont(Font* theFont)
+{
+ if (mYesButton != NULL)
+ mYesButton->SetFont(theFont);
+
+ if (mNoButton != NULL)
+ mNoButton->SetFont(theFont);
+}
+
+void Dialog::SetHeaderFont(Font* theFont)
+{
+ delete mHeaderFont;
+ mHeaderFont = theFont->Duplicate();
+}
+
+void Dialog::SetLinesFont(Font* theFont)
+{
+ delete mLinesFont;
+ mLinesFont = theFont->Duplicate();
+}
+
+void Dialog::EnsureFonts()
+{
+ if (mHeaderFont == NULL)
+ mHeaderFont = new SysFont(gSexyAppBase, "Arial Unicode MS", 14);
+ if (mLinesFont == NULL)
+ mLinesFont = new SysFont(gSexyAppBase, "Arial Unicode MS", 12);
+}
+
+int Dialog::GetPreferredHeight(int theWidth)
+{
+ EnsureFonts();
+
+ int aHeight = mContentInsets.mTop + mContentInsets.mBottom + mBackgroundInsets.mTop + mBackgroundInsets.mBottom;
+
+ bool needSpace = false;
+ if (mDialogHeader.length() > 0)
+ {
+ aHeight += mHeaderFont->GetHeight() - mHeaderFont->GetAscentPadding();
+ needSpace = true;
+ }
+
+ if (mDialogLines.length() > 0)
+ {
+ if (needSpace)
+ aHeight += mSpaceAfterHeader;
+ Graphics g;
+ g.SetFont(mLinesFont);
+ aHeight += GetWordWrappedHeight(&g, theWidth-mContentInsets.mLeft-mContentInsets.mRight-mBackgroundInsets.mLeft-mBackgroundInsets.mRight-4, mDialogLines, mLinesFont->GetLineSpacing() + mLineSpacingOffset);
+ needSpace = true;
+ }
+
+ if ((mDialogFooter.length() != 0) && (mButtonMode != BUTTONS_FOOTER))
+ {
+ if (needSpace)
+ aHeight += 8;
+ aHeight += mHeaderFont->GetLineSpacing();
+ needSpace = true;
+ }
+
+ if (mYesButton != NULL)
+ {
+ if (needSpace)
+ aHeight += 8;
+ aHeight += mButtonHeight + 8;
+ }
+
+ return aHeight;
+}
+
+void Dialog::Draw(Graphics* g)
+{
+ EnsureFonts();
+
+ Rect aBoxRect(mBackgroundInsets.mLeft,mBackgroundInsets.mTop,mWidth-mBackgroundInsets.mLeft-mBackgroundInsets.mRight,mHeight-mBackgroundInsets.mTop-mBackgroundInsets.mBottom);
+ if (mComponentImage != NULL)
+ {
+ g->DrawImageBox(aBoxRect,mComponentImage);
+ }
+ else
+ {
+ g->SetColor(GetColor(COLOR_OUTLINE, Color(gDialogColors[COLOR_OUTLINE])));
+ g->DrawRect(12, 12, mWidth - 12*2 - 1, mHeight - 12*2 - 1);
+ g->SetColor(GetColor(COLOR_BKG, Color(gDialogColors[COLOR_BKG])));
+ g->FillRect(12+1, 12+1, mWidth - 12*2 - 2, mHeight - 12*2 - 2);
+
+ g->SetColor(Color(0, 0, 0, 128));
+ g->FillRect(mWidth - 12, 12*2, 12, mHeight - 12*3);
+ g->FillRect(12*2, mHeight-12, mWidth - 12*2, 12);
+ }
+
+ int aCurY = mContentInsets.mTop + mBackgroundInsets.mTop;
+
+ if (mDialogHeader.length() > 0)
+ {
+ aCurY += mHeaderFont->GetAscent() - mHeaderFont->GetAscentPadding();
+
+ g->SetFont(mHeaderFont);
+ g->SetColor(mColors[COLOR_HEADER]);
+ WriteCenteredLine(g, aCurY, mDialogHeader);
+
+ aCurY += mHeaderFont->GetHeight() - mHeaderFont->GetAscent();
+
+ aCurY += mSpaceAfterHeader;
+ }
+
+ //g->SetFont(mLinesFont);
+ g->SetFont(mLinesFont);
+ g->SetColor(mColors[COLOR_LINES]);
+
+ /*for (int i = 0; i < mDialogLines.size(); i++)
+ {
+ WriteCenteredLine(g, aCurY, mDialogLines[i]);
+ aCurY += mLinesFont->GetHeight();
+ }*/
+
+ Rect aRect(mBackgroundInsets.mLeft+mContentInsets.mLeft+2, aCurY, mWidth-mContentInsets.mLeft-mContentInsets.mRight-mBackgroundInsets.mLeft-mBackgroundInsets.mRight-4, 0);
+ aCurY += WriteWordWrapped(g, aRect, mDialogLines, mLinesFont->GetLineSpacing() + mLineSpacingOffset, mTextAlign);
+
+ if ((mDialogFooter.length() != 0) && (mButtonMode != BUTTONS_FOOTER))
+ {
+ aCurY += 8;
+ aCurY += mHeaderFont->GetLineSpacing();
+
+ g->SetFont(mHeaderFont);
+ g->SetColor(mColors[COLOR_FOOTER]);
+ WriteCenteredLine(g, aCurY, mDialogFooter);
+ }
+}
+
+void Dialog::AddedToManager(WidgetManager* theWidgetManager)
+{
+ Widget::AddedToManager(theWidgetManager);
+
+ if (mYesButton != NULL)
+ theWidgetManager->AddWidget(mYesButton);
+ if (mNoButton != NULL)
+ theWidgetManager->AddWidget(mNoButton);
+}
+
+void Dialog::RemovedFromManager(WidgetManager* theWidgetManager)
+{
+ Widget::RemovedFromManager(theWidgetManager);
+
+ if (mYesButton != NULL)
+ theWidgetManager->RemoveWidget(mYesButton);
+ if (mNoButton != NULL)
+ theWidgetManager->RemoveWidget(mNoButton);
+}
+
+void Dialog::OrderInManagerChanged()
+{
+ Widget::OrderInManagerChanged();
+ if (mYesButton != NULL)
+ mWidgetManager->PutInfront(mYesButton,this);
+ if (mNoButton != NULL)
+ mWidgetManager->PutInfront(mNoButton,this);
+}
+
+void Dialog::Resize(int theX, int theY, int theWidth, int theHeight)
+{
+ Widget::Resize(theX, theY, theWidth, theHeight);
+
+ if ((mYesButton != NULL) && (mNoButton != NULL))
+ {
+ int aBtnWidth = (mWidth - mContentInsets.mLeft - mContentInsets.mRight - mBackgroundInsets.mLeft - mBackgroundInsets.mRight - mButtonSidePadding*2 - mButtonHorzSpacing) / 2;
+ int aBtnHeight = mButtonHeight;
+
+ mYesButton->Resize(mX + mBackgroundInsets.mLeft + mContentInsets.mLeft + mButtonSidePadding, mY + mHeight - mContentInsets.mBottom - mBackgroundInsets.mBottom - aBtnHeight, aBtnWidth, aBtnHeight);
+ mNoButton->Resize(mYesButton->mX + aBtnWidth + mButtonHorzSpacing, mYesButton->mY, aBtnWidth, aBtnHeight);
+ }
+ else if (mYesButton != NULL)
+ {
+ int aBtnHeight = mButtonHeight;
+
+ mYesButton->Resize(mX + mContentInsets.mLeft + mBackgroundInsets.mLeft, mY + mHeight - mContentInsets.mBottom - mBackgroundInsets.mBottom - aBtnHeight,
+ mWidth - mContentInsets.mLeft - mContentInsets.mRight - mBackgroundInsets.mLeft - mBackgroundInsets.mRight, aBtnHeight);
+ }
+}
+
+void Dialog::MouseDown(int x, int y, int theBtnNum, int theClickCount)
+{
+ if (theClickCount == 1)
+ {
+ mWidgetManager->mApp->SetCursor(CURSOR_DRAGGING);
+ mDragging = true;
+ mDragMouseX = x;
+ mDragMouseY = y;
+ }
+ Widget::MouseDown(x,y,theBtnNum, theClickCount);
+}
+
+void Dialog::MouseDrag(int x, int y)
+{
+ if (mDragging)
+ {
+ int aNewX = mX + x - mDragMouseX;
+ int aNewY = mY + y - mDragMouseY;
+
+ if (aNewX < -8)
+ aNewX = -8;
+ else if (aNewX + mWidth > mWidgetManager->mWidth + 8)
+ aNewX = mWidgetManager->mWidth - mWidth + 8;
+
+ if (aNewY < -8)
+ aNewY = -8;
+ else if (aNewY + mHeight > mWidgetManager->mHeight + 8)
+ aNewY = mWidgetManager->mHeight- mHeight + 8;
+
+ mDragMouseX = mX + x - aNewX;
+ mDragMouseY = mY + y - aNewY;
+
+ if (mDragMouseX < 8)
+ mDragMouseX = 8;
+ else if (mDragMouseX > mWidth-9)
+ mDragMouseX = mWidth-9;
+
+ if (mDragMouseY < 8)
+ mDragMouseY = 8;
+ else if (mDragMouseY > mHeight-9)
+ mDragMouseY = mHeight-9;
+
+ Move(aNewX, aNewY);
+ }
+}
+
+void Dialog::MouseUp(int x, int y, int theBtnNum, int theClickCount)
+{
+ if (mDragging)
+ {
+ mWidgetManager->mApp->SetCursor(CURSOR_POINTER);
+ mDragging = false;
+ }
+ Widget::MouseUp(x,y, theBtnNum, theClickCount);
+}
+
+void Dialog::Update()
+{
+ Widget::Update();
+
+ //Move(mX, mY+1);
+}
+
+bool Dialog::IsModal()
+{
+ return mIsModal;
+}
+
+int Dialog::WaitForResult(bool autoKill)
+{
+ //gSexyAppBase->DoMainLoop(mId);
+
+ while ((gSexyAppBase->UpdateAppStep(NULL)) && (mWidgetManager != NULL) && (mResult == 0x7FFFFFFF));
+
+ if (autoKill)
+ gSexyAppBase->KillDialog(mId);
+
+ return mResult;
+}
+
+void Dialog::ButtonPress(int theId)
+{
+ if ((theId == ID_YES) || (theId == ID_NO))
+ mDialogListener->DialogButtonPress(mId, theId);
+}
+
+void Dialog::ButtonDepress(int theId)
+{
+ if ((theId == ID_YES) || (theId == ID_NO))
+ {
+ mResult = theId;
+ mDialogListener->DialogButtonDepress(mId, theId);
+ }
+}
+
+void Dialog::ButtonDownTick(int theId)
+{
+}