File indexing completed on 2024-04-14 05:35:06

0001 #!/usr/bin/perl -w
0002 
0003 # Laurent Montel <montel@kde.org> (2014)
0004 # KFileDialog::getOpenFileName(...) => QFileDialog::getOpenFileName(...)
0005 # find -iname "*.cpp" -o -iname "*.h" |xargs kde-dev-scripts/kf5/convert-kfiledialog.pl
0006 # TODO need to improve it.
0007 use strict;
0008 use File::Basename;
0009 use lib dirname($0);
0010 use functionUtilkde;
0011 
0012 sub defaultUrl
0013 {
0014   my ($starturl) = @_;
0015   $starturl = functionUtilkde::cleanSpace($starturl);
0016   warn "$starturl \n";
0017   if ($starturl eq "KUrl()" || $starturl eq "QUrl()" || $starturl eq "") {
0018       return 1;
0019   }
0020   return 0;
0021 }
0022 
0023 foreach my $file (@ARGV) {
0024 
0025     my $modified;
0026     open(my $FILE, "<", $file) or warn "We can't open file $file:$!\n";
0027     my %varname = ();
0028     my $needQFileDialog;
0029     my @l = map {
0030         my $orig = $_;
0031 
0032         #const QString fileName = KFileDialog::getOpenFileName( KUrl(), QString(), d->wParent, i18n("Attach File" ) );
0033 
0034         my $regexp = qr/
0035            ^(\s*)                        # (1) Indentation, possibly "Classname *" (the ? means non-greedy)
0036            (.*?)                         # (2) Possibly "Classname *" (the ? means non-greedy)
0037            (\w+)                         # (3) variable name
0038            \s*=\s*                       #   assignment
0039            KFileDialog::getOpenFileName\s*\((.*)\)  # (4)  new KPushButton(...,...,...,...);
0040            (.*)$                         # (5) afterreg
0041            /x; # /x Enables extended whitespace mode
0042         if (my ($indent, $left, $var, $argument, $afterreg) = $_ =~ $regexp) {
0043            warn "QFileDialog::getOpenFileName found\n";
0044            my $constructor_regexp = qr/
0045                                  ^([^,]*)         # Url
0046                                  (?:,\s*([^,]*))?        # filter
0047                                  (?:,\s*([^,]*))?        # parent
0048                                  (?:,\s*([^,]*))?        # caption
0049                                  (.*)$              # after
0050                                  /x;
0051            my ($url, $filter, $parent, $caption, $after);
0052            if ( ($url, $filter, $parent, $caption, $after) = $argument =~  $constructor_regexp ) {
0053               $_ = $indent . $left . $var . " = QFileDialog::getOpenFileName(";
0054               if (defined $parent) {
0055                  $_ .= "$parent";
0056               } else {
0057                  $_ .= "0";
0058               }
0059               if (defined $caption) {
0060                  $_ .= ", $caption";
0061               } else {
0062                  $_ .= ", QString()";
0063               }
0064               if (defined $url) {
0065                  if ($url eq "KUrl()") {
0066                     $_ .= ", QString()";
0067                  } else {
0068                     $_ .= ", $url";
0069                  }
0070               } else {
0071                  $_ .= ", QString()";
0072               }
0073               if (defined $filter) {
0074                  $_ .= ", $filter);\n";
0075               } else {
0076                  $_ .= "QString());\n";
0077               }
0078               $needQFileDialog = 1;
0079            }
0080         }
0081 
0082        
0083         my $regexgetExistingDirectory = qr/
0084            ^(\s*)                        # (1) Indentation
0085            (.*?)                         # (2) Possibly "Classname *" (the ? means non-greedy)
0086            (\w+)                         # (3) variable name
0087            \s*=\s*                       #   assignment
0088            KFileDialog::getExistingDirectory\s*\((.*)\)  # (4)  KFileDialog::getExistingDirectory(...)
0089            (.*)$                         # (5) afterreg
0090            /x; # /x Enables extended whitespace mode
0091         if (my ($indent, $left, $var, $argument, $afterreg) = $_ =~ $regexgetExistingDirectory) {
0092            warn "QFileDialog::getExistingDirectory found\n";
0093            my $constructor_regexp = qr/
0094                                  ^([^,]*)           # (1) Url
0095                                  (?:,\s*([^,]*))?   # (2) parent
0096                                  (?:,\s*([^,]*))?   # (3) caption
0097                                  (.*)$              # (4) after
0098                                  /x;
0099            my ($url, $parent, $caption, $after);
0100            if ( ($url, $parent, $caption, $after) = $argument =~  $constructor_regexp ) {
0101               $_ = $indent . $left . $var . " = QFileDialog::getExistingDirectory(";
0102               if (defined $parent) {
0103                  $_ .= "$parent";
0104               } else {
0105                  $_ .= "0";
0106               }
0107               if (defined $caption) {
0108                  $_ .= ", $caption";
0109               } else {
0110                  $_ .= ", QString()";
0111               }
0112               if (defined $url) {
0113                  $url =~ s, ,,g;
0114                  if ($url eq "KUrl()" || $url eq "QUrl()" || $url eq "") {
0115                     $_ .= ");\n";
0116                  } else {
0117                     $_ .= ", $url);\n";
0118                  }
0119               } else {
0120                  $_ .= ")\n";
0121               }
0122               $needQFileDialog = 1;
0123            }
0124         }
0125 
0126         my $regexgetSaveFileName = qr/
0127            ^(\s*)                        # (1) Indentation
0128            (.*?)                         # (2) Possibly "Classname *" (the ? means non-greedy)
0129            (\w+)                         # (3) variable name
0130            \s*=\s*                       #   assignment
0131            KFileDialog::getSaveFileName\s*\((.*)\)  # (4)  KFileDialog::getSaveFileName(...)
0132            (.*)$                         # (5) afterreg
0133            /x; # /x Enables extended whitespace mode
0134         if (my ($indent, $left, $var, $argument, $afterreg) = $_ =~ $regexgetSaveFileName) {
0135            warn "QFileDialog::getSaveFileName found\n";
0136            my $constructor_regexp = qr/
0137                                  ^([^,]*)           # (1) startUrl
0138                                  (?:,\s*([^,]*))?   # (2) filter
0139                                  (?:,\s*([^,]*))?   # (3) parent
0140                                  (?:,\s*([^,]*))?   # (4) caption
0141                                  (?:,\s*([^,]*))?   # (5) option
0142                                  (.*)$              # (6) after
0143                                  /x;
0144            my ($starturl, $filter, $parent, $caption, $option, $after);
0145            if ( ($starturl, $filter, $parent, $caption, $option, $after) = $argument =~  $constructor_regexp ) {
0146               $_ = $indent . $left . $var . " = QFileDialog::getSaveFileName(";
0147               if ((not defined $parent) and (not defined $caption) and (defaultUrl($starturl) eq "1") and (not defined $filter) and (not defined $option)) {
0148                 $_ .= ");\n";
0149               } else {
0150                 #QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), const QString & filter = QString(), QString * selectedFilter = 0, Options options = 0
0151                 if (defined $parent) {
0152                    $_ .= "$parent";
0153                 } else {
0154                    $_ .= "0";
0155                 }
0156                 if (defined $caption) {
0157                    $_ .= ", $caption";
0158                 } else {
0159                    $_ .= ", QString()";
0160                 }
0161                 if (defined $starturl) {
0162                    $starturl = functionUtilkde::cleanSpace($starturl);
0163                    if (defaultUrl($starturl) eq "1" ) {
0164                      $_ .= ", QString()";
0165                    } else {
0166                       $_ .= ", $starturl";
0167                    }
0168                 } else {
0169                    $_ .= ", QString()";
0170                 }
0171                 if (defined $filter) {
0172                    $_ .= ", $filter";
0173                 } else {
0174                    $_ .= ", QString()";
0175                 }
0176                 if (defined $option) {
0177                    $option =~ s, ,,g;
0178                    if ($option =~ /KFileDialog::ConfirmOverwrite/) {
0179                       $_ .=");\n"
0180                    } else {
0181                      warn "$file : QFileDialog::getSaveFileName : fix me option \'$option\'\n";
0182                      $_ .= ", 0, $option);\n"; # TODO fix option
0183                    }
0184                 } else {
0185                    $_ .= ");\n"; # TODO fix option
0186                 }
0187               }
0188               $needQFileDialog = 1;
0189            }
0190         }
0191 
0192         my $regexgetOpenUrl = qr/
0193            ^(\s*)                        # (1) Indentation
0194            (.*?)                         # (2) Possibly "Classname *" (the ? means non-greedy)
0195            (\w+)                         # (3) variable name
0196            \s*=\s*                       #   assignment
0197            KFileDialog::getOpenUrl\s*\((.*)\)  # (4)  KFileDialog::getOpenUrl(...)
0198            (.*)$                         # (5) afterreg
0199            /x; # /x Enables extended whitespace mode
0200         if (my ($indent, $left, $var, $argument, $afterreg) = $_ =~ $regexgetOpenUrl) {
0201            warn "QFileDialog::getOpenUrl found\n";
0202            my $constructor_regexp = qr/
0203                                  ^([^,]*)           # (1) Url
0204                                  (?:,\s*([^,]*))?   # (2) filter
0205                                  (?:,\s*([^,]*))?   # (3) parent
0206                                  (?:,\s*([^,]*))?   # (4) caption
0207                                  (.*)$              # (5) after
0208                                  /x;
0209            my ($url, $filter, $parent, $caption, $after);
0210            if ( ($url, $filter, $parent, $caption, $after) = $argument =~  $constructor_regexp ) {
0211               $_ = $indent . $left . $var . " = QFileDialog::getOpenFileUrl(";
0212               if (defined $parent) {
0213                  $_ .= "$parent";
0214               } else {
0215                  $_ .= "0";
0216               }
0217               if (defined $caption) {
0218                  $_ .= ", $caption";
0219               } else {
0220                  $_ .= ", QString()";
0221               }
0222               if (defined $url) {
0223                  $url =~ s, ,,g;
0224                  if ($url eq "KUrl()" || $url eq "QUrl()" || $url eq "") {
0225                     $_ .= "QString()";
0226                  } else {
0227                     $_ .= ", $url";
0228                  }
0229               }
0230               
0231               if (defined $filter) {
0232                  $_ .= ", $filter);" . $after . "\n";
0233               } else {
0234                  $_ .= ");" . $after . "\n";
0235               }
0236               $needQFileDialog = 1;
0237            }
0238         }
0239 
0240 
0241         $modified ||= $orig ne $_;
0242         $_;
0243     } <$FILE>;
0244 
0245     if ($modified) {
0246         open (my $OUT, ">", $file);
0247         print $OUT @l;
0248         close ($OUT);
0249         if ($needQFileDialog) {
0250            functionUtilkde::addIncludeInFile($file, "QFileDialog");
0251            #TODO remove KFileDialog when all KFileDialog is converted in files
0252            #functionUtilkde::removeIncludeInFile($file, "KFileDialog");
0253         }
0254     }
0255 }
0256 
0257 functionUtilkde::diffFile( "@ARGV" );