Welcome

DFRefactor - The Automated Refactoring Tool for DataFlex

DFRefactor is a tool written in DataFlex that helps with refactoring of old DataFlex code.

It consists of a series of functions to help in the refactoring process. Each refactoring function is represented by a checkbox.

There are two types of refactoring functions; Refactoring Functions and Reporting Functions. The first category makes actual changes to the selected source code, while the second category only creates a report what may need to handled later manually.

There is also an on-line version of the local .chm help text that can be found here .

Created By:

Nils Svedmyr

Wil van Antwerpen

Sean Bamforth

Allan Kim Eriksen

Chris Spenser

Bob Worsley

Marcia Booth

Download from: rdctools.com

Download from: vdf-guidance.com

Copyright © 2018-2019 by RDC Tools International. All Rights Reserved. Portions Copyright by DataAccess Worldwide.


What's New

See under respective version number for bug fixes and implemented suggestions.

Version 3.0.0.2

•The change to display folders and subfolders in the "Select Folders" grid called for another change. Since we have tried to keep the height of the application as small as possible to allow Wil and others who are using low screen resolutions, to view all refactoring functions without the need to scroll the top part up and down, a horizontal splitter was needed between the top and bottom part of the RefactorView. This makes it possible to use the splitter to display more than a few rows of the "Select Folders" grid if a larger resolution is being used. This has now been implemented.

•Added a cursor wait while the Select Folders grid is filled with data.

•Added a context (right-click) menu to the cRDCCJSelectionGrid class to select, add and remove grid items. The menu always has four items; Toggle Current Item, Select All, Select None and Invert Selection. With the two properties pbShowAddFolderMenuItem and pbShowRemoveFolderMenuItem set to True, two more items can be displayed; Add Folder and Remove Item From Grid.

•Changed the logic for the "Select Folders" on the RefactorView view, to show the full path for all folders and subfolders for the selected workspace. This makes it possible to select subfolders to be involved in the refactoring process. This also had a deep impact on how folders and files were collected, so those routines had to be changed as well, and was also made more robust (no more "if x contains y"). It also fixes a bug that only manifested itself when there was a dot (.) in the folder name like e.g. "MyWorkspace2.0\AppSrc".

•The Add Folder button was removed and replaced by a right-click grid menu. The "Select Folders" group is now also the bottom container that has anchors set to bottom-left-right, as it needs to be resized to show full folder paths.

•Added a dialog for showing the log file (LogFileDialog.dg)

•Added a new toolbar button for the UnusedSourceFiles dialog.

•Added a new dialog "UnusedSourceFiles.dg" that is filled with source files never used, if the "Unused source files" routine was selected. The dialog makes it easy to move one or more of them to the backup area.

•Added a new setting to the ProgramSetup.dg dialog. A new combobox was added to set the selected row color for the cRDCCJSelectionGrid class. This is the same as the cCJGrid piSelectedRowBackColor property. By default set to clBlueGreyLight, but that can be a bit difficult to read, so it is now configurable. The cRDCCJSelectionGrid class was changed accordingly.

•Added logic to the Function ProcessFile to move the backup file back to its original place if unchanged.

Version 3.0.0.1

•Added tooltip support for the cRDCHeaderGroup class.

•Changed the tooltip style of the whole application to use balloon style. This includes the addition of a new message: DoChangeTooltipFormat for the ghoCJCommandbarSystem object.

•Changed the ActionBackup.ico icon as the old was indicating a cloud backup.

•Finished the work with the BackupFiles dialog. Can be used to move back source files from the backup folder structure to their original place. The dialog will overwrite the source file with the backed up file copy and no checking is done on file dates or if they already exists.

•Made the directory separator to a constant string CS_DirSeparator and changed all DFRefactor workspace code to use it.

•Added new class cRDCCJSelectionGrid that as the name suggests a class to be used for displaying data and to make selections from. Used by the "Select Folders" on the RefactorView, the DeleteWorkspaceHistory.dg and the BackupFiles.dg.

•Added new "Current Workspace Backup Files" dialog. It contains all the backup files made by the tool for the current workspace. The idea is that the files selected gets copied back to their original position and then deleted, when the "Move Files" button is pressed.

•Changed the "inner working loop" for the tool. Due to historical reasons it had become to difficult to follow. The change was to first collect all involved folders, then to collect all files for all of those folders into one struct array. Then the work is performed on that struct array, file-by-file.

•Added "Set peVisualTheme to xtpReportThemeVisualStudio2012Light" to grids. This makes selected items checkboxes appear in bold "text".

•Changed the cRDCCheckbox class so it is possible to click the "info" bitmap to the right of the checkbox, as it is was part of the checkbox object itself.

•Added property to the cRDCCheckbox class, pbCreateInfoItem. The default = True and means that an info text object is added to the right of the checkbox with an "ActionInfo.bmp" image. When the mouse is hovered over it the tooltip text will be shown, but no tooltip is shown over the checkbox. Much like how many web-controls works. Set pbCreateInfoItem to False to use the standard checkbox tooltip behavior.

•Added properties to the cRDCHeaderGroup class to easily change the header text size. Set pbUseLargeFontHeight to True to use 12 points for the text. The default = False and means the text used will be 10 points.

•Changed the toolbars so that both the workspace and source file is shown without the path. Instead the paths are shown as tooltips. This made it possible to join the first two rows of toolbars into one.

•Moved the tab-pages to show at the left hand side instead of at the top to allow for more vertical screen space.

•Added a setting to the Program Settings panel to change the icon size used in the toolbars.

•Added sorting to the Theme toolbar combo.

•Added a third column for the refactoring functions to use more of the vertical screen estate.

•Fixed a bug in cRemoveUnusedLocals.pkg reported by Martin Arvidsson when there was an end comment on a variable declaration line.

•Fixed a bug when a file was dropped on the RefactorView.vw.

•Updated the DFRefactor.chm with images for the programs new look & feel.

•Fixed a bug with the cRemoveUnusedLocals class where it would fail when there was a comment on a variable declaration line and no variables was used in the code. Then the line wasn't removed from code resulting in a compile error.

•Fixed a bug with drag & drop on the RefactorView.vw.


What is refactoring?

DFRefactor - Automated Code Refactoring for DataFlex

Why refactoring and what is it?

What is code refactoring?

Code refactoring is a disciplined technique for restructuring existing computer code - altering its internal structure without changing its functionality (external behavior).

It consists of small, incremental changes that leave the code in a better state than when it was found.

We expect cleaner code when done.

What is not code refactoring?

Changing an algorithm to something much faster is obviously not refactoring, because the external behavior is changed.

We do not expect new behavior with refactoring.

Why refactoring code?

"By continuously improving the design of code, we make it easier and easier to work with. This is in sharp contrast to what typically happens: little refactoring and a great deal of attention to expediently adding new features. If you get into the hygienic habit of refactoring continuously, you'll find that it is easier to extend and maintain code."

- Joshua Kerievsky, Refactoring to Patterns

There are two general categories of benefits when it comes to refactoring

1. Maintainability. It is easier to fix bugs because the source is easy to read and the intent of its author is easy to grasp. This might be achieved by reducing large monolithic routines into a set of individually concise, well-named, single-purpose methods. It might be achieved by moving a method to a more appropriated class,or removing misleading comments.

2. Extensibility. It is easier to extend the capabilities of the application if it uses recognizable design patterns, and it provides some flexibility where none before may have existed.

Why automated refactoring?

Manual refactoring, while giving the optimal refactoring freedom, can be extremely tedious and quite easily become error prone. With automated refactoring on the other hand, you use a specified set of refactoring routines of which each and every one has been intensively tested and proven to work, thus minimizing the risk that the external structure of your program gets compromised.


Overview

How to use the program

•To be able to refactor your code you need to select a workspace by selecting an *.sws file. This is needed for the program's backup logic.

•Decide if the refactoring process should take place on a single file or the whole workspace. You do that by clicking one of the Workspace or File mode radio buttons.

•If the Workspace mode was selected, select which source code folders should participate in the refactoring process. Do that by selecting folders in the Folders and File Extensions group. In the same group you can select which file name extensions should be worked on, with the File extensions to parse drop down list.

Note: You can drag & drop *.sws files, folders, and source files onto the program from Windows Explorer.

•Select refactoring routines by selecting/unselecting the checkboxes.

Pay special note to checkboxes with an asterisk (*) after the label, by reading the tooltip carefully (or study the help text (this text) for those checkboxes.

•Click the Run Now button

When the button is pressed, the Editor tab page gets activated. This is because some of the refactoring routines rely on the inner workings of the Scintilla code editor, which the Editor view is based upon.

Important! Prior running any routine you should ALWAYS have made a backup of source code, and/or have checked in all changes to a version control program. There is no guarantee that everything goes according to plan once the Run Now button has been pressed. It is your responsibility to have your source code properly checked in and/or backed up.

The DFRefactor tool has backup logic built-in. (See also the Program Properties dialog), but you should also make sure you have taken the above safety measurements. The tool creates a 'DFRefactor Backup' folder in the workspace home (root) folder. It then creates a series of subfolders to match the selected folders and subfolders that is to be worked on.

Important: If you hit the Run Now button twice, the original backed up source file will not be overwritten with the one you just changed. The backup logic will not overwrite the backup copy for two days after the initial back up. If you run the tool again with the same workspace selected after two days, a new backup copy will be created.

•Click the Program Settings toolbar button to control how the program will operate.

•Click the Editor Settings toolbar button to change how the Scintilla editor of the Editor view operates. The most important settings are the font and tab-size to be used during refactoring and how you would like the DataFlex keywords to be upper/lower cased.


How It Works

1. Select Workspace

You first need to open a workspace. Open by clicking the Open Workspace toolbar button and select a .sws file. You can select a .sws file for any DataFlex version, as the version doesn't matter. Alternatively you can click the down arrow of the split button, to display a list of previously used workspaces. Even if you are going to work on a single file, the backup logic of DFReractor needs a selected workspace. You can also drag & drop a *.sws file to the program from Windows Explorer.

The selected .sws workspace file will be displayed to the right of the Select Workspace toolbar button:

Note: You can drag & drop *.sws files, folders, and source files onto the program from Windows Explorer.

Note: The interface has changes slightly and the path is not shown as displayed above. Instead you can hover the mouse over the file name and the full path will be displayed.

2. Workspace or File Mode?

The refactoring process can take place on either a series of source files, or a single file only. You select the mode by selecting either of the Workspace or File radio buttons in the toolbar.

If only a single file should be worked on, click the Open Source File button that is placed on top of the Workspace/File radio buttons. The Workspace/File mode will then automatically change to File mode.

3. Select Refactoring Routines

Select the checkboxes for the Refactoring Functions and Report Functons of choice. Pay special attention to the functions that have an asterisk (*) after the checkbox label.

See Refactoring Routines for details about each function.

4. Select Folders

If the Workspace mode has been selected you need to specify which folders should be included in the refactoring process. You can select folders from the list with the space bar. You can also right click the grid and then from the popup menu select the option to toggle the select state and add or delete a grid folder. It is also possible to drag & drop a folder to the program from Windows Explorer.

Important: All subfolders for the selected folders will also be searched for source files as well.

The grid will be unavailable if the File toolbar radio button has been selected because then only one source file will take part in the refactoring process. You can also drag & drop a source file to the program from Windows Explorer.

5. Select File Extensions

Select a collection of file extensions from the drop down, or enter your own file extensions.

Every source file which has one of the selected extensions in all of the selected folders and all their subfolders will take part in the refactoring process.

6. Run Now

Important! Prior running any routine you should ALWAYS have made a backup of source code, and/or have checked in all changes to a version control program. There is no guarantee that everything goes according to plan once the Run Now button has been pressed. It is your responsibility to have your source code properly checked in and/or backed up.

The DFRefactor tool has backup logic built-in. (See also the Program Properties dialog), but you should also make sure you have taken the above safety measurements. The tool creates a 'DFRefactor Backup' folder in the workspace home (root) folder. It then creates a series of subfolders to match the selected folders and subfolders that is to be worked on.

Important: If you hit the Run Now button twice, the original backed up source file will not be overwritten with the one you just changed. The backup logic will not overwrite the backup copy for two days after the initial back up. If you run the tool again with the same workspace selected after two days, a new backup copy will be created.

Click the Run Now button in the lower right corner of the Refactoring view to begin the process. Note that some of the refactoring processes can take quite some time, but just sit back, relax, pour yourself a cup of coffee and wait until the work has finished.

There are actually three sorts of refactoring functions. First, there is the checkboxes in the Refactoring Functions group which control actual code changes. Then there is the Report Functions group with functions that do not make any changes to the code but merely creates a text report listing source files.

The Refactoring Functions group can further be divided into two groups; The first reads the source line by line and makes various changes depending on the functions selected.. The second group needs the editor object (Editor view) to carry out its task. You shouldn't need to distinguish between the two and the tool will automatically load source files to the editor when needed, make changes and saves the file. However, this is the reason the program changes to the Editor view when the Run Now button is pressed.


Toolbars

Open Workspace/Current Workspace button (Alt+W)

Click on the Open Workspace button and select an *.sws workspace file. Alternatively, you can press the down-arrow of the split button to select a previously opened workspace.

After the workspace has been opened, the text changes to Current Workspace and the workspace file name is shown to the right.

Note: The interface has changes slightly and the path is not shown as displayed above. Instead you can hover the mouse over the file name and the full path will be displayed.

Clear Workspace button (Ctrl+F5)

This clears both the selection of the workspace and the file, if one has been opened.

Workspace History button

Click to display a popup dialog where you can remove previously saved workspace history items.

Open Containing Folder button

This will open Windows Explorer for the selected workspace. If a file has been opened, it will be highlighted in Windows Explorer.

Open Source File button (Alt+O or Ctrl+O)

Only use this button if you would like to work on one file only and not an entire workspace. After a source file has been selected it will be displayed with full path to the right of the button.

Note: The interface has changes slightly and the path is not shown as displayed above. Instead you can hover the mouse over the file name and the full path will be displayed.

Clear Source File Button (F5)

Closes the open source file.

Refactor Mode radio button (Alt+F toggles between the two modes)

The tool can work in one of two modes. If the File radio button is selected, all work is done on a single selected source file. If the Workspace radio is selected all actions will be done on all workspace source files that matches the File extensions to parse drop down list from the Refactoring view (below the grid) and for all selected folders in the grid above it.

Save Changes button (Ctrl+S or F2)

Save changes made (if source file changes has been made in the editor.)

Undo Changes (Ctrl+Z)

Undo the last editor change

Unused Source Files (Alt+I)

Shows Unused Source Files dialog where unused files can be selected to be moved to the backup area.

Undo refactoring process

Attempts to undo the last refactoring process by copying back files from the DFRefactor_Backup folder structure to their original position.

Show Log File (Alt+L)

The statistics text that is shown in the dialog after you have clicked the Run Now is also saved to DFRefactoringLogfile.txt log file. It is saved in the workspace DFRefactor Backup sub folder.

Compare Tool button

Click to start the file comparison tool. This is an external program you need to have installed. You set up which program to use with the Program Settings button.

Starzen's DataFlex Source Explorer button

This is - just like the Compare Tool button, an external program that needs to be installed separately. You set it up from the Program Settings dialog.

Program Settings button

Pops up the Program Settings dialog where you can set various program settings.

Editor Settings button

Pops up the Editor Settings dialog where you can set all sorts of properties for the Scintilla editor that is used by the Editor view.

Theme Selector drop down

Use it to select a visual theme that changes the look & feel of the program.

About button

Displays a popup dialog with info about the program, including version and a list of the authors.

Help button

That would be this button. Note that there is also an on-line help available and it might be more recent than this help file. You need to click the down-arrow on the split help button to be able to select the on-line help.

Exit button

Ends the program.


Refactoring Routines

The tool can be run in either of two modes; Workspace or File mode. If File mode has been selected from the toolbar, any refactoring functions selected will be applied to that single file only. On the other hand; if Workspace mode is selected, they will be applied to all source code files that matches the drop-down list of File extensions to parse, for all the selected folders in the grid and all their subfolders.

There are two distinct groups of refactoring routines.

a) Refactoring Functions that make changes to the source code.

b) Report Functions that only report anomalies in the source code and writes out a list of affected source files.

Refactoring Functions

Remove Studio markers

Removes old "//AB" IDE markers. Earlier versions of the DataFlex Studio were called the 'IDE' and it used various place markers to separate code areas. These are no longer needed and only clutter up the code base and it is therefor advised that they be removed.

Example:

//AB/ Object // prj

//AB/ End_Object // prj

//AB-StoreStart

Procedure Prompt_Callback integer hSL

Set Initial_Column of hSL to 0

End_Procedure

//AB-StoreEnd

Remove Project object structure

Removes the 'Project Object Structure' comments at the top of source files. It also removes 'Register_Object' for those same objects. It is smart enough to only remove Register_Object lines for objects that are part of the Project Object Structure.

Example:

// Project Object Structure

// BATCH is a dbView

// Ac_DD is a DataDictionary

// Art_DD is a DataDictionary

// Artdisc_DD is a DataDictionary

// Artgrp_DD is a DataDictionary

// Cashhdr_DD is a DataDictionary

// Cashline_DD is a DataDictionary

// Cashlst_DD is a DataDictionary

// Container1 is a dbContainer3d

Which later is followed by;

Register_Object BATCH

Register_Object Ac_DD

Register_Object Art_DD

Register_Object Artdisc_DD

Register_Object Artgrp_DD

Register_Object Cashhdr_DD

Register_Object Cashline_DD

Register_Object Cashlst_DD

Register_Object Container1

Remove Trailing spaces

Removes spaces at the end of lines

Remove End comments after End_Class/End_Object/End_Function/End_Procedure

Remove comments after End_Class/End_Object/End_Function/End_Procedure as they easily get out of sync, meaning that e.g. the object/procedure/function name is changed but adjusting the bottom end comment to match the new name is forgotten.

Example:

Procedure MyNewProcedure String sText

Send Update

End_Procedure //MyProcedure

Remove 'Local' keyword from variable declarations

Removes the keyword: 'Local' from variable declaration lines in functions and procedures as they no longer apply.

Example:

Procedure Activate Returns Integer

Local Integer iRetval iOk

Remove property keyword: Public

Removes the keyword: Public from property declarations as it is no longer serves any purpose.

Example:

Property String pSelStart1 Public ""

Property String pSelStop1 Public ""

Remove property keyword: Private*

Removes the keyword: Private from property declarations. Note that in some rare cases you might need to tweak your code if it is removed. Because of that reason, this option is unchecked by default.

Example:

Property String pSelStart1 Private ""

Property String pSelStop1 Private ""

Replace Calc/MoveInt/MoveReal/MoveNum/MoveStr with the Move command

In earlier DataFlex versions there existed several variants of the Move command, but they are obsolete they can be replaced with the correct Move command, making the code easier to read. The Studio's code complete syntax helper also understands the Move command, but none of the others.

Example:

Calc (iVar + 2) to iMyVar

Will be changed into into

Move (iVar + 2) to iMyVar

MoveStr "New Label" to sMyVar

Will be changed into into

Move "New Label" to sMyVar

Remove Unused local variables

Removes variables declared in functions and procedures that are never used.

Remove hard coded MS Sans Serif fonts

Removes hard coded: MS Sans Serif fonts if present. With more recent versions of DataFlex fonts are handled much better than before and these font settings usually makes the application look strange.

Change Get U_<Class Name> to (RefClass(<class>))

Replaces 'Get Create U_ClassName' with 'Get Create (RefClass(ClassName))'.

Example:

Get Create U_Array to hoArray

Is replaced with;

Get Create (RefClass(Array) to hoArray

Remove Blank lines

Blank lines can be good to make it easier to read the source code. To many blank lines thought makes it harder to read. How maximum blank lines there should be is a personal preference. The checkbox therefor have a spinform to the right where the Max blank lines can be set. The routine does not distinguish between objects and methods. The same max blank lines are enforced equally in the source.

Example:

// order by name;

Use Windows.pkg

Use MSSQLDRV.pkg

Use SQL.pkg

Set Border_Style to Border_Thick

Set Label to "Chapter 3 Sample (Microsoft SQL)"

Set Location to 2 2

Set Size to 172 299

Object oResults is a cTextEdit

Will be changed into into

// order by name;

Use Windows.pkg

Use MSSQLDRV.pkg

Use SQL.pkg

Set Border_Style to Border_Thick

Set Label to "Chapter 3 Sample (Microsoft SQL)"

Set Location to 2 2

Set Size to 172 299

Object oResults is a cTextEdit

Rewrite single line If/Else constructs with Multiple lines

Restructures single if/else code lines to multiple lines, which makes debugging much easier. The first radio button will break the line with a space followed by a semi column. The second radio button will break the line with a semi column (no space in between). The third radio button will break the line by adding a begin / end block. The tab size governs how many spaces should be used when indenting the code block. Changing this setting changes how the editor (Editor view) indents. The same setting can be found on the Editor Properties dialog.

Example:

If (iRetval = 0) Procedure_Return

Which would be replaced to one of these three formats;

If (iRetval = 0) Begin

Procedure_Return

End

Or;

If (iRetval = 0) ; // Space before the ";" character

Procedure_Return

Or;

If (iRetval = 0);

Procedure_Return

Reindent* code

Re-indents the source file. You can change the Tab Size from the 'Editor Settings (Alt+D)' dialog. NOTE: This is a Scintilla editor library function and will slow down the refactoring considerably.

Example:

Use POTEXT.DD

Use ARTSUB.DD

DEFERRED_VIEW Activate_Art2Auto FOR ;

Object Art2Auto is a DbView

Procedure Activating

Forward send Activating

Set Value of oform2 to Comp.Mps_PoodAddr

Set Value of oform3 to Comp.Mps_PopHeadtyp

End_Procedure

Would with a tab-size of 4 be changed into:

Use POTEXT.DD

Use ARTSUB.DD

DEFERRED_VIEW Activate_Art2Auto FOR ;

Object Art2Auto is a DbView

Procedure Activating

Forward send Activating

Set Value of oform2 to Comp.Mps_PoodAddr

Set Value of oform3 to Comp.Mps_PopHeadtyp

End_Procedure

Adjust Upper/Lowercase*

Changes the case of DataFlex keywords for a source file. Note: You can change keyword spellings from the 'Editor Settings (Alt+D)' dialog to match your personal preferences. NOTE: This is a Scintilla editor library function and will slow down the refactoring considerably.

Example:

procedure onclick

integer iRec

number nOheadOno

date dDate

Get file_field_current_value of Caltrans_DD)) File_Field Caltrans.Recnum to iRec

Get file_field_current_value of Caltrans_DD File_Field Caltrans.PoHead_Ono to nOheadOno

Get file_field_current_value of Calcum_D File_Field Calcum.Date to dDate

if (nOheadOno = 0) begin

If (iRec <> 0) Begin

Will be changed into into:

Procedure OnClick

Integer iRec

Number nOheadOno

Date dDate

Get File_Field_Current_Value of Caltrans_DD)) File_Field Caltrans.Recnum to iRec

Get File_Field_Current_Value of Caltrans_DD File_Field Caltrans.Pohead_Ono to nOheadOno

Get File_Field_Current_Value of Calcum_D File_Field Calcum.Date to ddate

If (nOheadOno = 0) Begin

If (iRec <> 0) Begin

Drop Self*

Drop Self for the currently loaded file. In a view/dialog calling a method of an object no longer needs the (Self) keyword, so it can be removed making the code easier to read. NOTE: You will get a question to replace or not replace for each and every occasion of the 'Self' word. This is needed because at this moment the code that checks this does not know the difference between an object and a property.

Example of correct replacement:

Set Label of (oMyObject(Self)) to "New Label"

Will be changed into into

Set Label of oMyObject to "New Label"

However, this replacement would not work;

Set Enabled_State of (phoButton(Self)) to True

Will be changed into into

Set Enabled_State of phoButton to True

This particular change would break your code and that is something we do not want to do.

To alleviate the pain, the confirmation dialog that asks the question has a checkbox to remember the choice for the object you made a choice for, as you indicated it was an object or not.

Report Functions

Report Unused source files

Report source files that are never Used. Writes a list of all unused source files to a log file and shows them in a "Unused Source Files" grid dialog. It will NOT make any changes to the source, but from the dialog you can select which files (if any) should be moved to the backup area.


License

License - The DFRefactor Tool

The DFRefactor tool is released as freeware. You are allowed to freely use it and distribute it as long as you don't sell it or distribute the source code as a part of a commercial product.

The detailed license terms can also be found in the Help folder; "GNU Lesser General Public License.txt"

GNU LESSER GENERAL PUBLIC LICENSE

Version 3, 29 June 2007

Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>

Everyone is permitted to copy and distribute verbatim copies

of this license document, but changing it is not allowed.

This version of the GNU Lesser General Public License incorporates

the terms and conditions of version 3 of the GNU General Public

License, supplemented by the additional permissions listed below.

0. Additional Definitions.

As used herein, "this License" refers to version 3 of the GNU Lesser

General Public License, and the "GNU GPL" refers to version 3 of the GNU

General Public License.

"The Library" refers to a covered work governed by this License,

other than an Application or a Combined Work as defined below.

An "Application" is any work that makes use of an interface provided

by the Library, but which is not otherwise based on the Library.

Defining a subclass of a class defined by the Library is deemed a mode

of using an interface provided by the Library.

A "Combined Work" is a work produced by combining or linking an

Application with the Library. The particular version of the Library

with which the Combined Work was made is also called the "Linked

Version".

The "Minimal Corresponding Source" for a Combined Work means the

Corresponding Source for the Combined Work, excluding any source code

for portions of the Combined Work that, considered in isolation, are

based on the Application, and not on the Linked Version.

The "Corresponding Application Code" for a Combined Work means the

object code and/or source code for the Application, including any data

and utility programs needed for reproducing the Combined Work from the

Application, but excluding the System Libraries of the Combined Work.

1. Exception to Section 3 of the GNU GPL.

You may convey a covered work under sections 3 and 4 of this License

without being bound by section 3 of the GNU GPL.

2. Conveying Modified Versions.

If you modify a copy of the Library, and, in your modifications, a

facility refers to a function or data to be supplied by an Application

that uses the facility (other than as an argument passed when the

facility is invoked), then you may convey a copy of the modified

version:

a) under this License, provided that you make a good faith effort to

ensure that, in the event an Application does not supply the

function or data, the facility still operates, and performs

whatever part of its purpose remains meaningful, or

b) under the GNU GPL, with none of the additional permissions of

this License applicable to that copy.

3. Object Code Incorporating Material from Library Header Files.

The object code form of an Application may incorporate material from

a header file that is part of the Library. You may convey such object

code under terms of your choice, provided that, if the incorporated

material is not limited to numerical parameters, data structure

layouts and accessors, or small macros, inline functions and templates

(ten or fewer lines in length), you do both of the following:

a) Give prominent notice with each copy of the object code that the

Library is used in it and that the Library and its use are

covered by this License.

b) Accompany the object code with a copy of the GNU GPL and this license

document.

4. Combined Works.

You may convey a Combined Work under terms of your choice that,

taken together, effectively do not restrict modification of the

portions of the Library contained in the Combined Work and reverse

engineering for debugging such modifications, if you also do each of

the following:

a) Give prominent notice with each copy of the Combined Work that

the Library is used in it and that the Library and its use are

covered by this License.

b) Accompany the Combined Work with a copy of the GNU GPL and this license

document.

c) For a Combined Work that displays copyright notices during

execution, include the copyright notice for the Library among

these notices, as well as a reference directing the user to the

copies of the GNU GPL and this license document.

d) Do one of the following:

0) Convey the Minimal Corresponding Source under the terms of this

License, and the Corresponding Application Code in a form

suitable for, and under terms that permit, the user to

recombine or relink the Application with a modified version of

the Linked Version to produce a modified Combined Work, in the

manner specified by section 6 of the GNU GPL for conveying

Corresponding Source.

1) Use a suitable shared library mechanism for linking with the

Library. A suitable mechanism is one that (a) uses at run time

a copy of the Library already present on the user's computer

system, and (b) will operate properly with a modified version

of the Library that is interface-compatible with the Linked

Version.

e) Provide Installation Information, but only if you would otherwise

be required to provide such information under section 6 of the

GNU GPL, and only to the extent that such information is

necessary to install and execute a modified version of the

Combined Work produced by recombining or relinking the

Application with a modified version of the Linked Version. (If

you use option 4d0, the Installation Information must accompany

the Minimal Corresponding Source and Corresponding Application

Code. If you use option 4d1, you must provide the Installation

Information in the manner specified by section 6 of the GNU GPL

for conveying Corresponding Source.)

5. Combined Libraries.

You may place library facilities that are a work based on the

Library side by side in a single library together with other library

facilities that are not Applications and are not covered by this

License, and convey such a combined library under terms of your

choice, if you do both of the following:

a) Accompany the combined library with a copy of the same work based

on the Library, uncombined with any other library facilities,

conveyed under the terms of this License.

b) Give prominent notice with the combined library that part of it

is a work based on the Library, and explaining where to find the

accompanying uncombined form of the same work.

6. Revised Versions of the GNU Lesser General Public License.

The Free Software Foundation may publish revised and/or new versions

of the GNU Lesser General Public License from time to time. Such new

versions will be similar in spirit to the present version, but may

differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the

Library as you received it specifies that a certain numbered version

of the GNU Lesser General Public License "or any later version"

applies to it, you have the option of following the terms and

conditions either of that published version or of any later version

published by the Free Software Foundation. If the Library as you

received it does not specify a version number of the GNU Lesser

General Public License, you may choose any version of the GNU Lesser

General Public License ever published by the Free Software Foundation.

If the Library as you received it specifies that a proxy can decide

whether future versions of the GNU Lesser General Public License shall

apply, that proxy's public statement of acceptance of any version is

permanent authorization for you to choose that version for the

Library.


Disclaimer

Disclaimer - The DFRefactor Tool

The software is provided "AS IS" without any warranty, either expressed or implied, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose. The author will not be liable for any special, incidental, consequential or indirect damages due to loss of data or any other reason.


Feedback

Feedback - DFRefactor

If you have any problem, suggestion, comment, or you found a bug in the source code, You are encouraged to post to and follow the conversation on the DataAccess Worldwide Newsgroup: "Code Library" .

You can alternatively send a message to support@rdctools.com .

Visit us at: www.vdf-guidance.com and www.rdctools.com


Introduction

Copyright © 2018 by RDC Tools International. All Rights Reserved. Portions Copyright by DataAccess Worldwide.