+/////////////////////////////////////////////////////////////////////////////
+// Name: settingsdlg.cpp
+// Purpose: Settings dialog for Frame Layout
+// Author: Aleksandras Gluchovas
+// Modified by:
+// Created: 05/11/98
+// RCS-ID: $Id$
+// Copyright: (c) Aleksandras Gluchovas
+// Licence: wxWindows license
+/////////////////////////////////////////////////////////////////////////////
+
+#ifdef __GNUG__
+#pragma implementation "settingsdlg.cpp"
+#pragma interface "settingsdlg.cpp"
+#endif
+
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#include "wx/wx.h"
+#endif
+
+#include <stdlib.h>
+#include "settingsdlg.h"
+
+/***** Implementation for class SettingsDlg *****/
+
+#define ID_NOTES ( wxEVT_FIRST + 1000 )
+#define ID_HINTANIM_CHECK ( ID_NOTES + 1 )
+#define ID_RTUPDATES_CHECK ( ID_NOTES + 2 )
+
+BEGIN_EVENT_TABLE( SettingsDlg, wxDialog )
+
+ EVT_BUTTON( wxID_APPLY, SettingsDlg::OnApply )
+ EVT_BUTTON( ID_NOTES, SettingsDlg::OnNotes )
+
+ EVT_CHECKBOX( ID_HINTANIM_CHECK, SettingsDlg::OnHintAnimCheck )
+ EVT_CHECKBOX( ID_RTUPDATES_CHECK, SettingsDlg::OnRTUpdatesCheck )
+
+END_EVENT_TABLE()
+
+SettingsDlg::SettingsDlg( wxWindow* pParent )
+
+ : wxDialog( pParent, -1, "Active Layout Settings...",
+ wxDefaultPosition,
+ wxSize( 325,585),
+ wxDIALOG_MODAL | wxCAPTION )
+{
+ int curY = 10;
+ int lMargin = 50;
+ int lBoxMargin = lMargin - 20;
+ int checkHeight = 20;
+ int labelHeight = 20;
+ int boxWidth = 260;
+ int interBoxGap = 10;
+ int lastItemGap = 10;
+
+ int topY = curY;
+
+ curY += labelHeight;
+
+ mpRTU_Check = new wxCheckBox( this, ID_RTUPDATES_CHECK,
+ "&Real-time updates",
+ wxPoint( lMargin, curY ) );
+
+ curY += checkHeight;
+
+ mpOPD_Check = new wxCheckBox( this, -1, "&Out of Pane drag",
+ wxPoint( lMargin, curY ) );
+
+ curY += checkHeight;
+
+ mpEDP_Check = new wxCheckBox( this, -1, "&Exact docking prediction",
+ wxPoint( lMargin, curY ) );
+
+ curY += checkHeight;
+
+ mpNDF_Check = new wxCheckBox( this, -1, "Non-destructive bar &friction",
+ wxPoint( lMargin, curY ) );
+
+ curY += checkHeight;
+
+ mpSPB_Check = new wxCheckBox( this, -1, "&Shaded pane borders",
+ wxPoint( lMargin, curY ) );
+
+ curY += checkHeight + lastItemGap;
+
+ wxStaticBox* pDNDBox = new wxStaticBox( this, -1, "Drag && Drop settings",
+ wxPoint( lBoxMargin, topY ),
+ wxSize( boxWidth, curY - topY ) );
+
+ curY += interBoxGap;
+
+ ////////////////////////////////////////////////////////////////////
+
+ topY = curY;
+
+ curY += labelHeight;
+
+ mpHAP_Check = new wxCheckBox( this, ID_HINTANIM_CHECK,
+ "&Hint-Rect animation plugin",
+ wxPoint( lMargin, curY ) );
+
+ curY += checkHeight;
+
+ mpGCU_Check = new wxCheckBox( this, -1, "\"Garbage collecting\" &Updates-Mgr.",
+ wxPoint( lMargin, curY ) );
+
+ curY += checkHeight;
+
+ mpAFP_Check = new wxCheckBox( this, -1, "&Antiflicker plugin",
+ wxPoint( lMargin, curY ) );
+
+ curY += checkHeight;
+
+ mpCSP_Check = new wxCheckBox( this, -1, "C&ustomization plugin",
+ wxPoint( lMargin, curY ) );
+
+ curY += checkHeight + lastItemGap;
+
+ wxStaticBox* pPBox = new wxStaticBox( this, -1, "Plugins",
+ wxPoint( lBoxMargin, topY ),
+ wxSize( boxWidth, curY - topY ) );
+
+ curY += interBoxGap;
+
+ ////////////////////////////////////////////////////////////////////
+
+ wxSize fieldSz( 30,20 );
+ int fieldHeight = 20;
+ int fieldCapMargin = lMargin + fieldSz.x + 5;
+ int fieldCapOfs = 4;
+
+ topY = curY;
+
+ curY += labelHeight;
+
+ mpRWInput = new wxTextCtrl ( this, -1, "",
+ wxPoint( lMargin, curY ),
+ fieldSz );
+
+ mpRWLabel = new wxStaticText ( this, -1, "Resizing sash width(height)",
+ wxPoint( fieldCapMargin, curY + fieldCapOfs ) );
+
+
+ curY += fieldHeight;
+
+ mpPTMInput = new wxTextCtrl ( this, -1, "",
+ wxPoint( lMargin, curY ),
+ fieldSz );
+
+ mpPTMLabel = new wxStaticText( this, -1, "Pene's top margin",
+ wxPoint( fieldCapMargin, curY + fieldCapOfs ) );
+
+
+ curY += fieldHeight;
+
+
+ mpPBMInput = new wxTextCtrl ( this, -1, "",
+ wxPoint( lMargin, curY ),
+ fieldSz );
+
+ mpPBMLabel = new wxStaticText( this, -1, "Pene's bottom margin",
+ wxPoint( fieldCapMargin, curY + fieldCapOfs ) );
+
+
+ curY += fieldHeight;
+
+
+ mpPLMInput = new wxTextCtrl ( this, -1, "",
+ wxPoint( lMargin, curY ),
+ fieldSz );
+
+ mpPLMLabel = new wxStaticText( this, -1, "Pane's left margin",
+ wxPoint( fieldCapMargin, curY + fieldCapOfs ) );
+
+
+ curY += fieldHeight;
+
+
+ mpPRMInput = new wxTextCtrl ( this, -1, "",
+ wxPoint( lMargin, curY ),
+ fieldSz );
+
+ mpPRMLabel = new wxStaticText( this, -1, "Pane's right margin",
+ wxPoint( fieldCapMargin, curY + fieldCapOfs ) );
+
+ curY += fieldHeight + lastItemGap;
+
+ wxStaticBox* pCPPBox = new wxStaticBox( this, -1, "Common Pane properties",
+ wxPoint( lBoxMargin, topY ),
+ wxSize( boxWidth, curY - topY ) );
+
+ curY += interBoxGap;
+
+ ////////////////////////////////////////////////////////////////////
+
+ topY = curY;
+
+ curY += labelHeight;
+
+ fieldSz.x = 65;
+ fieldCapMargin = lMargin + fieldSz.x + 10;
+
+ mpDCInput = new wxTextCtrl ( this, -1, "",
+ wxPoint( lMargin, curY ),
+ fieldSz );
+
+ mpDCLabel = new wxStaticText ( this, -1, "Dark Color (hex-RGB)",
+ wxPoint( fieldCapMargin, curY + fieldCapOfs ) );
+
+ curY += fieldHeight;
+
+ mpLCInput = new wxTextCtrl ( this, -1, "",
+ wxPoint( lMargin, curY ),
+ fieldSz );
+
+ mpLCLabel = new wxStaticText ( this, -1, "Light Color (hex-RGB)",
+ wxPoint( fieldCapMargin, curY + fieldCapOfs ) );
+
+ curY += fieldHeight;
+
+ mpGCInput = new wxTextCtrl ( this, -1, "",
+ wxPoint( lMargin, curY ),
+ fieldSz );
+
+ mpGCLabel = new wxStaticText ( this, -1, "Gray Color (hex-RGB)",
+ wxPoint( fieldCapMargin, curY + fieldCapOfs ) );
+
+ curY += fieldHeight;
+
+ mpBCInput = new wxTextCtrl ( this, -1, "",
+ wxPoint( lMargin, curY ),
+ fieldSz );
+
+ mpBCLabel = new wxStaticText ( this, -1, "Pane border Color (hex-RGB)",
+ wxPoint( fieldCapMargin, curY + fieldCapOfs ) );
+
+ curY += fieldHeight + lastItemGap;
+
+ wxStaticBox* pCSPBox = new wxStaticBox( this, -1, "Coluor sheme properties",
+ wxPoint( lBoxMargin, topY ),
+ wxSize( boxWidth, curY - topY ) );
+
+ curY += interBoxGap; /*button ofs*/;
+
+ ////////////////////////////////////////////////////////////////////////////////
+
+ int lBtnMargin = 35;
+ int btnGap = 20;
+ int btnHeight = 22;
+ int btnWidth = 70;
+
+ wxButton* mpApplyBtn = new wxButton( this, wxID_APPLY, "A&pply",
+ wxPoint( lBtnMargin, curY ),
+ wxSize( btnWidth, btnHeight ) );
+
+ wxButton* mpCancelBtn = new wxButton( this, wxID_CANCEL, "&Cancel",
+ wxPoint( lBtnMargin + btnWidth + btnGap, curY ),
+ wxSize( btnWidth, btnHeight ) );
+
+ wxButton* mpNotesBtn = new wxButton( this, ID_NOTES, "&Notes...",
+ wxPoint( lBtnMargin + 2*btnWidth + 2*btnGap, curY ),
+ wxSize( btnWidth, btnHeight ) );
+
+ mpApplyBtn->SetDefault();
+ mpApplyBtn->SetFocus();
+
+ Center( wxBOTH );
+}
+
+void SettingsDlg::ExchangeFields( bool toDialog )
+{
+ mToDlg = toDialog;
+
+ ExchgCheck( mpRTU_Check, mRealTimeUpdatesOn );
+ ExchgCheck( mpOPD_Check, mOutOfPaneDragOn );
+ ExchgCheck( mpEDP_Check, mExactDockingPredictionOn );
+ ExchgCheck( mpNDF_Check, mNonDestructFrictionOn );
+ ExchgCheck( mpSPB_Check, m3DShadesOn );
+
+ ExchgCheck( mpHAP_Check, mHintRectAnimationOn );
+ ExchgCheck( mpGCU_Check, mGCUpdatesMgrOn );
+ ExchgCheck( mpAFP_Check, mAntiflickerPluginOn );
+ ExchgCheck( mpCSP_Check, mCustomizationPluginOn );
+
+ ExchgIntField( mpRWInput, mSashWidth );
+ ExchgIntField( mpPTMInput, mTopMargin );
+ ExchgIntField( mpPBMInput, mBottomMargin );
+ ExchgIntField( mpPLMInput, mLeftMargin );
+ ExchgIntField( mpPRMInput, mRightMargin );
+
+ ExchgColourField( mpDCInput, mDarkCol );
+ ExchgColourField( mpLCInput, mLightCol );
+ ExchgColourField( mpGCInput, mGrayCol );
+ ExchgColourField( mpBCInput, mBorderCol );
+}
+
+void SettingsDlg::OnApply( wxCommandEvent& event )
+{
+ ExchangeFields( FALSE );
+ EndModal( wxID_APPLY );
+}
+
+void SettingsDlg::OnNotes( wxCommandEvent& event )
+{
+ wxMessageBox("Notes go here...(TBD)");
+}
+
+void SettingsDlg::OnRTUpdatesCheck( wxCommandEvent& event )
+{
+ if ( mpRTU_Check->GetValue() == TRUE )
+ {
+ // user probably wants to see how the real-time drag & drop
+ // works -- so we "let 'im know" that animation is N/A when
+ // real-time option is on
+
+ mpHAP_Check->SetValue(FALSE);
+ mpHAP_Check->Refresh();
+ }
+}
+
+void SettingsDlg::OnHintAnimCheck( wxCommandEvent& event )
+{
+ if ( mpHAP_Check->GetValue() == TRUE )
+ {
+ // user probably wants to see some animation effects,
+ // but he/she forgot to turn off "real-time updates"
+ // setting -- so we do it for you :-)
+
+ mpRTU_Check->SetValue(FALSE);
+ mpRTU_Check->Refresh();
+ }
+}
+
+void SettingsDlg::ExchgCheck( wxCheckBox* pChk, bool& value )
+{
+ if ( mToDlg ) pChk->SetValue( value );
+
+ else value = pChk->GetValue();
+}
+
+void SettingsDlg::ExchgIntField( wxTextCtrl* pFld, int& value )
+{
+ if ( mToDlg )
+ {
+ char buf[32];
+
+ sprintf( buf, "%d", value );
+ pFld->SetValue( buf );
+ }
+ else
+ {
+ wxString txt = pFld->GetLineText( 0 );
+ value = atoi( txt );
+ }
+}
+
+void SettingsDlg::ExchgColourField( wxTextCtrl* pFld, wxColour& value )
+{
+ int rgbVal;
+
+ if ( mToDlg )
+ {
+ rgbVal = ( value.Red() & 0x0000FF ) |
+ ( (value.Green() << 8 ) & 0x00FF00 ) |
+ ( (value.Blue() << 16 ) & 0xFF0000 );
+
+ char buf[32];
+
+ sprintf( buf, "0x%06X", rgbVal );
+
+ pFld->SetValue( buf );
+ }
+ else
+ {
+ wxString txt = pFld->GetLineText( 0 );
+
+ sscanf( txt, "0x%06X", &rgbVal );
+
+ value.Set( rgbVal & 0xFF,
+ ( rgbVal >> 8 ) & 0xFF,
+ ( rgbVal >> 16 ) & 0xFF );
+ }
+}
+
+bool SettingsDlg::TransferDataToWindow()
+{
+ ExchangeFields( TRUE );
+
+ return TRUE;
+}
+
+bool SettingsDlg::TransferDataFromWindow()
+{
+ ExchangeFields( FALSE );
+
+ return TRUE;
+}
+
+#include "controlbar.h"
+#include "rowlayoutpl.h"
+#include "antiflickpl.h"
+#include "bardragpl.h"
+#include "cbcustom.h"
+
+#include "gcupdatesmgr.h"
+#include "hintanimpl.h"
+
+void SettingsDlg::ReadLayoutSettings( wxFrameLayout& fl )
+{
+ cbDockPane& pane = *fl.GetPane( wxTOP );
+ cbCommonPaneProperties& props = pane.mProps;
+
+ mRealTimeUpdatesOn = props.mRealTimeUpdatesOn;
+ mOutOfPaneDragOn = props.mOutOfPaneDragOn;
+ mExactDockingPredictionOn = props.mExactDockPredictionOn;
+ mNonDestructFrictionOn = props.mNonDestructFirctionOn;
+ m3DShadesOn = props.mShow3DPaneBorderOn;
+
+ mHintRectAnimationOn = fl.FindPlugin( CLASSINFO( cbHintAnimationPlugin ) ) != NULL;
+ mAntiflickerPluginOn = fl.FindPlugin( CLASSINFO( cbAntiflickerPlugin ) ) != NULL;
+ mCustomizationPluginOn = fl.FindPlugin( CLASSINFO( cbSimpleCustomizationPlugin ) ) != NULL;
+ mGCUpdatesMgrOn = fl.GetUpdatesManager().GetClassInfo()
+ == CLASSINFO( cbGCUpdatesMgr );
+
+ mSashWidth = props.mResizeHandleSize;
+
+ mTopMargin = pane.mTopMargin;
+ mBottomMargin = pane.mBottomMargin;
+ mLeftMargin = pane.mLeftMargin;
+ mRightMargin = pane.mRightMargin;
+
+ mDarkCol = fl.mDarkPen.GetColour();
+ mLightCol = fl.mLightPen.GetColour();
+ mGrayCol = fl.mGrayPen.GetColour();
+ mBorderCol = fl.mBorderPen.GetColour();
+}
+
+void SettingsDlg::ApplyLayoutSettings( wxFrameLayout& fl )
+{
+ cbCommonPaneProperties props;
+
+ props.mRealTimeUpdatesOn = mRealTimeUpdatesOn;
+ props.mOutOfPaneDragOn = mOutOfPaneDragOn;
+ props.mExactDockPredictionOn = mExactDockingPredictionOn;
+ props.mNonDestructFirctionOn = mNonDestructFrictionOn;
+ props.mShow3DPaneBorderOn = m3DShadesOn;
+
+ props.mResizeHandleSize = mSashWidth;
+
+ fl.SetPaneProperties( props, wxALL_PANES );
+
+ if ( mHintRectAnimationOn ) fl.AddPlugin ( CLASSINFO( cbHintAnimationPlugin ) );
+ else fl.RemovePlugin( CLASSINFO( cbHintAnimationPlugin ) );
+
+ if ( mAntiflickerPluginOn ) fl.AddPlugin ( CLASSINFO( cbAntiflickerPlugin ) );
+ else fl.RemovePlugin( CLASSINFO( cbAntiflickerPlugin ) );
+
+ if ( mCustomizationPluginOn ) fl.AddPlugin ( CLASSINFO( cbSimpleCustomizationPlugin ) );
+ else fl.RemovePlugin( CLASSINFO( cbSimpleCustomizationPlugin ) );
+
+ // FOR NOW:: unfortunatelly, currently pane marin-information is currently
+ // placed into cbDockPane, instead of cbCommonPaneProperties
+
+ fl.SetMargins( mTopMargin, mBottomMargin,
+ mLeftMargin, mRightMargin, wxALL_PANES );
+
+ fl.mDarkPen.SetColour( mDarkCol );
+ fl.mLightPen.SetColour( mLightCol );
+ fl.mGrayPen.SetColour( mGrayCol );
+ fl.mBorderPen.SetColour( mBorderCol );
+
+ fl.RecalcLayout( TRUE );
+
+ // NOTE:: currently it's bit tricky changing updates-manager
+ // in future, updates-manager will become a normal plugin
+ // and more convenient methods (Add/FindPlugin) will be used
+
+ if ( mGCUpdatesMgrOn &&
+ fl.GetUpdatesManager().GetClassInfo() != CLASSINFO( cbGCUpdatesMgr )
+ )
+
+ fl.SetUpdatesManager( new cbGCUpdatesMgr( &fl ) );
+ else
+ if ( !mGCUpdatesMgrOn &&
+ fl.GetUpdatesManager().GetClassInfo() == CLASSINFO( cbGCUpdatesMgr )
+ )
+
+ fl.SetUpdatesManager( new cbSimpleUpdatesMgr( &fl ) );
+}