/******************************************************************************** * * * W i z a r d W i d g e t * * * ********************************************************************************* * Copyright (C) 2002,2020 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public License * * along with this program. If not, see * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "fxmath.h" #include "FXArray.h" #include "FXHash.h" #include "FXMutex.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXStringDictionary.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXEvent.h" #include "FXWindow.h" #include "FXApp.h" #include "FXImage.h" #include "FXGIFIcon.h" #include "FXFrame.h" #include "FXImageFrame.h" #include "FXSeparator.h" #include "FXLabel.h" #include "FXButton.h" #include "FXPacker.h" #include "FXVerticalFrame.h" #include "FXHorizontalFrame.h" #include "FXSwitcher.h" #include "FXWizard.h" #include "icons.h" /* Notes: - It may be nice to be able to sensitize/desensitize the "Next" button based on having whether the necessary info has been entered into a pane. - Need callbacks to tell target whether FXWizard has switched panes. - Need to allow for choices in successor panes. */ // Padding for buttons #define HORZ_PAD 12 #define VERT_PAD 2 using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXWizard) FXWizardMap[]={ FXMAPFUNC(SEL_COMMAND,FXWizard::ID_NEXT,FXWizard::onCmdNext), FXMAPFUNC(SEL_UPDATE,FXWizard::ID_NEXT,FXWizard::onUpdNext), FXMAPFUNC(SEL_COMMAND,FXWizard::ID_BACK,FXWizard::onCmdBack), FXMAPFUNC(SEL_UPDATE,FXWizard::ID_BACK,FXWizard::onUpdBack), FXMAPFUNC(SEL_UPDATE,FXWizard::ID_ACCEPT,FXWizard::onUpdFinish), }; // Object implementation FXIMPLEMENT(FXWizard,FXDialogBox,FXWizardMap,ARRAYNUMBER(FXWizardMap)) // Construct free-floating Wizard FXWizard::FXWizard(FXApp* a,const FXString& name,FXImage *image,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs):FXDialogBox(a,name,opts,x,y,w,h,pl,pr,pt,pb,hs,vs){ construct(); setImage(image); } // Construct Wizard which will always float over the owner window FXWizard::FXWizard(FXWindow* own,const FXString& name,FXImage *image,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs):FXDialogBox(own,name,opts,x,y,w,h,pl,pr,pt,pb,hs,vs){ construct(); setImage(image); } // Common part of constructor void FXWizard::construct(){ nexticon=new FXGIFIcon(getApp(),arrownext); backicon=new FXGIFIcon(getApp(),arrowprev); finishicon=new FXGIFIcon(getApp(),entericon); buttons=new FXHorizontalFrame(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH|PACK_UNIFORM_HEIGHT,0,0,0,0,0,0,0,0); finish=new FXButton(buttons,tr("&Finish"),finishicon,this,ID_ACCEPT,ICON_AFTER_TEXT|FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_Y|LAYOUT_RIGHT,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); advance=new FXButton(buttons,tr("&Next"),nexticon,this,ID_NEXT,BUTTON_INITIAL|BUTTON_DEFAULT|ICON_AFTER_TEXT|FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_Y|LAYOUT_RIGHT,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); retreat=new FXButton(buttons,tr("&Back"),backicon,this,ID_BACK,ICON_BEFORE_TEXT|FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_RIGHT,0,0,0,0,HORZ_PAD+10,HORZ_PAD+10,VERT_PAD,VERT_PAD); new FXFrame(buttons,LAYOUT_FIX_WIDTH|LAYOUT_RIGHT,0,0,10,0); cancel=new FXButton(buttons,tr("&Cancel"),NULL,this,ID_CANCEL,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_Y|LAYOUT_RIGHT,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); new FXHorizontalSeparator(this,SEPARATOR_GROOVE|LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X); sidebar=new FXImageFrame(this,NULL,FRAME_GROOVE|LAYOUT_SIDE_LEFT|LAYOUT_CENTER_Y); panels=new FXSwitcher(this,LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0); finish->hide(); } // Update finish panel long FXWizard::onUpdFinish(FXObject* sender,FXSelector,void*){ sender->handle(this,(getCurrentPanel()handle(this,(getCurrentPanel()handle(this,(0numChildren(); } // Bring the child window at index to the top void FXWizard::setCurrentPanel(FXint index){ panels->setCurrent(index); } // Return the index of the child window currently on top FXint FXWizard::getCurrentPanel() const { return panels->getCurrent(); } // Change the image being displayed void FXWizard::setImage(FXImage* img){ sidebar->setImage(img); } // Return the current image FXImage* FXWizard::getImage() const { return sidebar->getImage(); } // Save object to stream void FXWizard::save(FXStream& store) const { FXDialogBox::save(store); store << buttons; store << sidebar; store << advance; store << retreat; store << finish; store << cancel; store << panels; store << finishicon; store << nexticon; store << backicon; } // Load object from stream void FXWizard::load(FXStream& store){ FXDialogBox::load(store); store >> buttons; store >> sidebar; store >> advance; store >> retreat; store >> finish; store >> cancel; store >> panels; store >> finishicon; store >> nexticon; store >> backicon; } // Destroy FXWizard::~FXWizard(){ delete finishicon; delete nexticon; delete backicon; buttons=(FXHorizontalFrame*)-1L; sidebar=(FXImageFrame*)-1L; advance=(FXButton*)-1L; retreat=(FXButton*)-1L; cancel=(FXButton*)-1L; finishicon=(FXIcon*)-1L; nexticon=(FXIcon*)-1L; backicon=(FXIcon*)-1L; } }