Merge remote-tracking branch 'base/master' into refactor
authorJørgen Lind <jorgen.lind@nokia.com>
Fri, 10 Jun 2011 08:50:10 +0000 (10:50 +0200)
committerJørgen Lind <jorgen.lind@nokia.com>
Fri, 10 Jun 2011 11:09:57 +0000 (13:09 +0200)
Conflicts:
examples/animation/animatedtiles/animatedtiles.pro
examples/animation/appchooser/appchooser.pro
examples/animation/moveblocks/moveblocks.pro
examples/animation/states/states.pro
examples/animation/stickman/stickman.pro
examples/dialogs/configdialog/configdialog.pro
examples/dialogs/sipdialog/sipdialog.pro
examples/dialogs/standarddialogs/standarddialogs.pro
examples/dialogs/tabdialog/tabdialog.pro
examples/draganddrop/draggableicons/draggableicons.pro
examples/draganddrop/draggabletext/draggabletext.pro
examples/draganddrop/fridgemagnets/fridgemagnets.pro
examples/draganddrop/puzzle/puzzle.pro
examples/gestures/imagegestures/imagegestures.pro
examples/graphicsview/basicgraphicslayouts/basicgraphicslayouts.pro
examples/graphicsview/collidingmice/collidingmice.pro
examples/graphicsview/elasticnodes/elasticnodes.pro
examples/graphicsview/weatheranchorlayout/weatheranchorlayout.pro
examples/itemviews/addressbook/addressbook.pro
examples/itemviews/chart/chart.pro
examples/itemviews/fetchmore/fetchmore.pro
examples/itemviews/puzzle/puzzle.pro
examples/mainwindows/menus/menus.pro
examples/painting/basicdrawing/basicdrawing.pro
examples/painting/concentriccircles/concentriccircles.pro
examples/painting/imagecomposition/imagecomposition.pro
examples/painting/painterpaths/painterpaths.pro
examples/painting/transformations/transformations.pro
examples/qtconcurrent/imagescaling/imagescaling.pro
examples/qtestlib/tutorial1/tutorial1.pro
examples/qtestlib/tutorial2/tutorial2.pro
examples/qtestlib/tutorial3/tutorial3.pro
examples/qtestlib/tutorial4/tutorial4.pro
examples/qtestlib/tutorial5/tutorial5.pro
examples/qws/dbscreen/dbscreen.pro
examples/qws/svgalib/svgalib.pro
examples/richtext/syntaxhighlighter/syntaxhighlighter.pro
examples/statemachine/rogue/rogue.pro
examples/tools/plugandpaintplugins/extrafilters/extrafilters.pro
examples/tools/styleplugin/plugin/plugin.pro
examples/uitools/multipleinheritance/multipleinheritance.pro
examples/widgets/analogclock/analogclock.pro
examples/widgets/calculator/calculator.pro
examples/widgets/calendarwidget/calendarwidget.pro
examples/widgets/codeeditor/codeeditor.pro
examples/widgets/icons/icons.pro
examples/widgets/imageviewer/imageviewer.pro
examples/widgets/lineedits/lineedits.pro
examples/widgets/movie/movie.pro
examples/widgets/shapedclock/shapedclock.pro
examples/widgets/softkeys/softkeys.pro
examples/widgets/tetrix/tetrix.pro
src/gui/painting/qpaintengine_raster.cpp
src/gui/painting/qpaintengine_raster_p.h
src/openvg/openvg.pro
src/openvg/qpaintengine_vg_p.h
src/plugins/graphicssystems/meego/meego.pro
src/plugins/platforms/fontdatabases/basicunix/basicunix.pri

129 files changed:
1  2 
examples/animation/animatedtiles/animatedtiles.pro
examples/animation/appchooser/appchooser.pro
examples/animation/moveblocks/moveblocks.pro
examples/animation/states/states.pro
examples/animation/stickman/stickman.pro
examples/dialogs/configdialog/configdialog.pro
examples/dialogs/sipdialog/sipdialog.pro
examples/dialogs/standarddialogs/standarddialogs.pro
examples/dialogs/tabdialog/tabdialog.pro
examples/draganddrop/draggableicons/draggableicons.pro
examples/draganddrop/draggabletext/draggabletext.pro
examples/draganddrop/fridgemagnets/fridgemagnets.pro
examples/draganddrop/puzzle/puzzle.pro
examples/effects/blurpicker/blurpicker.pro
examples/effects/fademessage/fademessage.pro
examples/effects/lighting/lighting.pro
examples/gestures/imagegestures/imagegestures.pro
examples/graphicsview/anchorlayout/anchorlayout.pro
examples/graphicsview/basicgraphicslayouts/basicgraphicslayouts.pro
examples/graphicsview/collidingmice/collidingmice.pro
examples/graphicsview/elasticnodes/elasticnodes.pro
examples/graphicsview/flowlayout/flowlayout.pro
examples/graphicsview/padnavigator/padnavigator.pro
examples/graphicsview/simpleanchorlayout/simpleanchorlayout.pro
examples/graphicsview/weatheranchorlayout/weatheranchorlayout.pro
examples/ipc/localfortuneclient/localfortuneclient.pro
examples/itemviews/addressbook/addressbook.pro
examples/itemviews/chart/chart.pro
examples/itemviews/combowidgetmapper/combowidgetmapper.pro
examples/itemviews/fetchmore/fetchmore.pro
examples/itemviews/frozencolumn/frozencolumn.pro
examples/itemviews/puzzle/puzzle.pro
examples/mainwindows/menus/menus.pro
examples/network/bearermonitor/bearermonitor.pro
examples/network/fortuneclient/fortuneclient.pro
examples/network/fortuneserver/fortuneserver.pro
examples/network/googlesuggest/googlesuggest.pro
examples/network/network-chat/network-chat.pro
examples/network/qftp/qftp.pro
examples/opengl/cube/cube.pro
examples/opengl/hellogl_es/hellogl_es.pro
examples/opengl/hellogl_es2/hellogl_es2.pro
examples/painting/basicdrawing/basicdrawing.pro
examples/painting/concentriccircles/concentriccircles.pro
examples/painting/imagecomposition/imagecomposition.pro
examples/painting/painterpaths/painterpaths.pro
examples/painting/transformations/transformations.pro
examples/qtconcurrent/imagescaling/imagescaling.pro
examples/qtestlib/tutorial1/tutorial1.pro
examples/qtestlib/tutorial2/tutorial2.pro
examples/qtestlib/tutorial3/tutorial3.pro
examples/qtestlib/tutorial4/tutorial4.pro
examples/qtestlib/tutorial5/tutorial5.pro
examples/qws/dbscreen/dbscreen.pro
examples/qws/framebuffer/framebuffer.pro
examples/qws/mousecalibration/mousecalibration.pro
examples/qws/simpledecoration/simpledecoration.pro
examples/qws/svgalib/svgalib.pro
examples/richtext/syntaxhighlighter/syntaxhighlighter.pro
examples/sql/drilldown/drilldown.pro
examples/sql/masterdetail/masterdetail.pro
examples/sql/sqlwidgetmapper/sqlwidgetmapper.pro
examples/statemachine/eventtransitions/eventtransitions.pro
examples/statemachine/rogue/rogue.pro
examples/statemachine/trafficlight/trafficlight.pro
examples/statemachine/twowaybutton/twowaybutton.pro
examples/threads/queuedcustomtype/queuedcustomtype.pro
examples/tools/contiguouscache/contiguouscache.pro
examples/tools/customtype/customtype.pro
examples/tools/customtypesending/customtypesending.pro
examples/tools/plugandpaintplugins/extrafilters/extrafilters.pro
examples/tools/styleplugin/plugin/plugin.pro
examples/touch/dials/dials.pro
examples/touch/fingerpaint/fingerpaint.pro
examples/touch/knobs/knobs.pro
examples/touch/pinchzoom/pinchzoom.pro
examples/tutorials/addressbook-fr/part1/part1.pro
examples/tutorials/addressbook-fr/part2/part2.pro
examples/tutorials/addressbook-fr/part3/part3.pro
examples/tutorials/addressbook-fr/part4/part4.pro
examples/tutorials/addressbook-fr/part5/part5.pro
examples/tutorials/addressbook-fr/part6/part6.pro
examples/tutorials/addressbook-fr/part7/part7.pro
examples/tutorials/widgets/childwidget/childwidget.pro
examples/tutorials/widgets/nestedlayouts/nestedlayouts.pro
examples/tutorials/widgets/toplevel/toplevel.pro
examples/tutorials/widgets/windowlayout/windowlayout.pro
examples/uitools/multipleinheritance/multipleinheritance.pro
examples/widgets/analogclock/analogclock.pro
examples/widgets/applicationicon/applicationicon.pro
examples/widgets/calculator/calculator.pro
examples/widgets/calendarwidget/calendarwidget.pro
examples/widgets/codeeditor/codeeditor.pro
examples/widgets/elidedlabel/elidedlabel.pro
examples/widgets/icons/icons.pro
examples/widgets/imageviewer/imageviewer.pro
examples/widgets/lineedits/lineedits.pro
examples/widgets/movie/movie.pro
examples/widgets/orientation/orientation.pro
examples/widgets/shapedclock/shapedclock.pro
examples/widgets/softkeys/softkeys.pro
examples/widgets/tetrix/tetrix.pro
examples/widgets/wiggly/wiggly.pro
examples/xml/dombookmarks/dombookmarks.pro
examples/xml/saxbookmarks/saxbookmarks.pro
mkspecs/features/qpa/basicunixfontdatabase.prf
src/gui/gui.pro
src/gui/painting/qpaintengine_raster.cpp
src/gui/painting/qpaintengine_raster_p.h
src/gui/painting/qpaintengineex_p.h
src/gui/painting/qpainter.cpp
src/gui/text/qfont.cpp
src/gui/text/qfont.h
src/gui/text/qfontengine_ft_p.h
src/gui/text/qtextengine.cpp
src/gui/text/qtextengine_p.h
src/gui/text/qtextlayout.cpp
src/gui/text/text.pri
src/opengl/opengl.pro
src/plugins/platforms/wayland/qwaylandwindow.cpp
src/testlib/testlib.pro
src/widgets/dialogs/qfiledialog.cpp
src/widgets/platforms/mac/qfontdatabase_mac.cpp
src/widgets/platforms/mac/qfontengine_coretext.mm
src/widgets/platforms/mac/qfontengine_coretext_p.h
src/widgets/platforms/mac/qpaintengine_mac_p.h
src/widgets/platforms/x11/qfontdatabase_x11.cpp
tests/auto/qfiledialog/tst_qfiledialog.cpp
tests/auto/qstatictext/tst_qstatictext.cpp

@@@ -11,5 -11,4 +11,5 @@@ symbian 
      TARGET.UID3 = 0xA000D7D1
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
@@@ -11,5 -11,4 +11,5 @@@ symbian 
      TARGET.UID3 = 0xA000E3F5
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
@@@ -10,5 -10,4 +10,5 @@@ symbian 
      TARGET.UID3 = 0xA000E3F7
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
@@@ -11,5 -11,4 +11,5 @@@ symbian 
      TARGET.UID3 = 0xA000E3F8
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
@@@ -24,5 -24,4 +24,5 @@@ symbian 
      TARGET.UID3 = 0xA000E3F9
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
@@@ -14,8 -14,7 +14,8 @@@ INSTALLS += target source
  symbian: CONFIG += qt_example
  wince50standard-x86-msvc2005: LIBS += libcmt.lib corelibc.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib coredll.lib winsock.lib ws2.lib
  
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
  simulator: warning(This example might not fully work on Simulator platform)
@@@ -11,10 -11,7 +11,9 @@@ INSTALLS += target source
  symbian: CONFIG += qt_example
  wince50standard-x86-msvc2005: LIBS += libcmt.lib corelibc.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib coredll.lib winsock.lib ws2.lib
  
 +QT += widgets
 +
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ maemo5: CONFIG += qt_example
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
  simulator: warning(This example might not fully work on Simulator platform)
@@@ -11,5 -11,4 +11,5 @@@ INSTALLS += target source
  symbian: CONFIG += qt_example
  wince50standard-x86-msvc2005: LIBS += libcmt.lib corelibc.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib coredll.lib winsock.lib ws2.lib
  
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
@@@ -10,7 -10,6 +10,7 @@@ INSTALLS += target source
  
  symbian: CONFIG += qt_example
  wince50standard-x86-msvc2005: LIBS += libcmt.lib corelibc.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib coredll.lib winsock.lib ws2.lib
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -13,5 -13,4 +13,5 @@@ symbian 
      TARGET.UID3 = 0xA000C615
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
@@@ -15,6 -15,5 +15,6 @@@ symbian 
      TARGET.UID3 = 0xA000CF64
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  simulator: warning(This example might not fully work on Simulator platform)
@@@ -16,7 -16,4 +16,6 @@@ symbian 
      CONFIG += qt_example
  }
  
 +QT += widgets
 +
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ maemo5: CONFIG += qt_example
@@@ -27,5 -27,4 +27,5 @@@ wince*: 
     addFile.path = .
     DEPLOYMENT += addFile
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
@@@ -7,7 -7,6 +7,7 @@@ target.path = $$[QT_INSTALL_EXAMPLES]/q
  sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS blurpicker.pro
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/effects/blurpicker
  INSTALLS += target sources
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
@@@ -12,8 -12,7 +12,8 @@@ sources.files = $$SOURCES 
      fademessage.pro
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/effects/fademessage
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
 +QT += widgets
  simulator: warning(This example might not fully work on Simulator platform)
@@@ -6,8 -6,7 +6,8 @@@ target.path = $$[QT_INSTALL_EXAMPLES]/q
  sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS lighting.pro
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/effects/lighting
  INSTALLS += target sources
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
@@@ -19,8 -19,7 +19,8 @@@ symbian 
      TARGET.UID3 = 0xA000D7D0
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  symbian: warning(This example does not work on Symbian platform)
  maemo5: warning(This example does not work on Maemo platform)
  simulator: warning(This example does not work on Simulator platform)
@@@ -7,9 -7,8 +7,9 @@@ sources.path = $$[QT_INSTALL_EXAMPLES]/
  INSTALLS += target sources
  
  TARGET = anchorlayout
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
  simulator: warning(This example might not fully work on Simulator platform)
@@@ -15,6 -15,5 +15,6 @@@ symbian 
      TARGET.UID3 = 0xA000A645
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  simulator: warning(This example might not fully work on Simulator platform)
@@@ -17,6 -17,5 +17,6 @@@ symbian 
      TARGET.UID3 = 0xA000A643
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  simulator: warning(This example might not fully work on Simulator platform)
@@@ -21,7 -21,6 +21,7 @@@ symbian 
      TARGET.UID3 = 0xA000A642
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
  simulator: warning(This example might not fully work on Simulator platform)
@@@ -7,8 -7,7 +7,8 @@@ QMAKE_PROJECT_NAME = flowlayout_graphic
  # Input
  HEADERS += flowlayout.h window.h
  SOURCES += flowlayout.cpp main.cpp window.cpp
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  simulator: warning(This example might not fully work on Simulator platform)
@@@ -7,8 -7,7 +7,8 @@@ sources.path = $$[QT_INSTALL_EXAMPLES]/
  INSTALLS += target sources
  
  TARGET = simpleanchorlayout
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  simulator: warning(This example might not fully work on Simulator platform)
@@@ -12,7 -12,6 +12,7 @@@ sources.files = $$SOURCES $$HEADERS $$R
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/graphicsview/weatheranchorlayout
  INSTALLS += target sources
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  simulator: warning(This example might not fully work on Simulator platform)
@@@ -20,6 -20,5 +20,6 @@@ symbian 
      TARGET.UID3 = 0xA000A646
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
@@@ -18,6 -18,5 +18,6 @@@ symbian 
      TARGET.UID3 = 0xA000A647
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
@@@ -7,7 -7,6 +7,7 @@@ target.path = $$[QT_INSTALL_EXAMPLES]/q
  sources.files = $$SOURCES $$HEADERS *.pro
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/itemviews/combowidgetmapper
  INSTALLS += target sources
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
@@@ -10,6 -10,5 +10,6 @@@ sources.files = $$SOURCES $$HEADERS *.p
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/itemviews/fetchmore
  INSTALLS += target sources
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
@@@ -7,7 -7,6 +7,7 @@@ target.path = $$[QT_INSTALL_EXAMPLES]/q
  sources.files = $$SOURCES $$HEADERS $$RESOURCES *.pro
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/itemviews/frozencolumn
  INSTALLS += target sources
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
@@@ -19,6 -19,5 +19,6 @@@ wince* 
     DEPLOYMENT_PLUGIN += qjpeg qgif qtiff
  }
  
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
@@@ -12,7 -12,6 +12,7 @@@ symbian 
      TARGET.UID3 = 0xA000CF66
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
  simulator: warning(This example might not fully work on Simulator platform)
Simple merge
Simple merge
@@@ -15,7 -15,6 +15,7 @@@ symbian 
      TARGET.UID3 = 0xA000A649
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
  simulator: warning(This example might not fully work on Simulator platform)
@@@ -14,6 -14,5 +14,6 @@@ symbian 
      TARGET.UID3 = 0xA000A64A
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
@@@ -13,6 -13,5 +13,6 @@@ symbian 
      TARGET.UID3 = 0xA000A64B
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
@@@ -15,6 -15,5 +15,6 @@@ symbian 
      TARGET.UID3 = 0xA000A64C
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
@@@ -14,8 -14,7 +14,8 @@@ symbian 
      TARGET.UID3 = 0xA000A64D
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -15,7 -15,6 +15,7 @@@ INSTALLS += target source
  symbian: CONFIG += qt_example
  
  wince*: DEPLOYMENT_PLUGIN += qgif qjpeg qtiff
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
  simulator: warning(This example does not work on Simulator platform)
@@@ -11,8 -11,7 +11,8 @@@ symbian 
      TARGET.UID3 = 0xA000C60B
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -11,8 -11,7 +11,8 @@@ symbian 
      TARGET.UID3 = 0xA000C60C
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -11,8 -11,7 +11,8 @@@ symbian 
      TARGET.UID3 = 0xA000C60D
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -11,8 -11,7 +11,8 @@@ symbian 
      TARGET.UID3 = 0xA000C60E
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -11,8 -11,7 +11,8 @@@ symbian 
      TARGET.UID3 = 0xA000C60F
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -9,8 -9,7 +9,8 @@@ HEADERS     = dbscreen.
  SOURCES     = dbscreendriverplugin.cpp \
                dbscreen.cpp 
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  symbian: warning(This example does not work on Symbian platform)
  simulator: warning(This example does not work on Simulator platform)
@@@ -9,10 -9,9 +9,10 @@@ target.path = $$[QT_INSTALL_EXAMPLES]/q
  sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS framebuffer.pro
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/qws/framebuffer
  INSTALLS += target sources
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example does not work on Symbian platform)
  simulator: warning(This example does not work on Simulator platform)
@@@ -9,10 -9,9 +9,10 @@@ target.path = $$[QT_INSTALL_EXAMPLES]/q
  sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS *.pro
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/qws/mousecalibration
  INSTALLS += target sources
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example does not work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -10,10 -10,9 +10,10 @@@ target.path = $$[QT_INSTALL_EXAMPLES]/q
  sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS *.pro
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/qws/simpledecoration
  INSTALLS += target sources
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example does not work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -17,9 -17,8 +17,9 @@@ SOURCES       = svgalibscreen.cpp 
            svgalibpaintdevice.cpp \
            svgalibplugin.cpp
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example does not work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -17,6 -17,5 +17,6 @@@ wince*: 
     addFiles.path = .
     DEPLOYMENT += addFiles
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
Simple merge
@@@ -5,9 -5,8 +5,9 @@@ target.path = $$[QT_INSTALL_EXAMPLES]/q
  sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS eventtransitions.pro
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/statemachine/eventtransitions
  INSTALLS += target sources
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
  simulator: warning(This example might not fully work on Simulator platform)
@@@ -9,7 -9,6 +9,7 @@@ sources.files = $$SOURCES $$HEADERS *.p
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/statemachine/rogue
  INSTALLS += target sources
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
@@@ -5,8 -5,7 +5,8 @@@ target.path = $$[QT_INSTALL_EXAMPLES]/q
  sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS trafficlight.pro
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/statemachine/trafficlight
  INSTALLS += target sources
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
@@@ -5,8 -5,7 +5,8 @@@ target.path = $$[QT_INSTALL_EXAMPLES]/q
  sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS twowaybutton.pro
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/statemachine/twowaybutton
  INSTALLS += target sources
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
@@@ -7,10 -7,9 +7,10 @@@ target.path = $$[QT_INSTALL_EXAMPLES]/q
  sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS contiguouscache.pro
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/tools/contiguouscache
  INSTALLS += target sources
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -17,5 -17,4 +17,5 @@@ INSTALLS += target source
  symbian: CONFIG += qt_example
  
  symbian:TARGET.EPOCALLOWDLLDATA = 1
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
@@@ -23,5 -23,4 +23,5 @@@ INSTALLS += target source
  symbian: CONFIG += qt_example
  
  symbian:TARGET.EPOCALLOWDLLDATA = 1
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
@@@ -6,10 -6,9 +6,10 @@@ target.path = $$[QT_INSTALL_EXAMPLES]/q
  sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS dials.pro
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/touch/dials
  INSTALLS += target sources
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -9,10 -9,9 +9,10 @@@ target.path = $$[QT_INSTALL_EXAMPLES]/q
  sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS fingerpaint.pro
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/touch/fingerpaint
  INSTALLS += target sources
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -6,10 -6,9 +6,10 @@@ target.path = $$[QT_INSTALL_EXAMPLES]/q
  sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS knobs.pro
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/touch/knobs
  INSTALLS += target sources
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -14,10 -14,9 +14,10 @@@ target.path = $$[QT_INSTALL_EXAMPLES]/q
  sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS pinchzoom.pro images
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/touch/pinchzoom
  INSTALLS += target sources
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -7,10 -7,9 +7,10 @@@ target.path = $$[QT_INSTALL_EXAMPLES]/q
  sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS part1.pro
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/tutorials/addressbook/part1
  INSTALLS += target sources
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -7,10 -7,9 +7,10 @@@ target.path = $$[QT_INSTALL_EXAMPLES]/q
  sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS part2.pro
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/tutorials/addressbook/part2
  INSTALLS += target sources
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -7,10 -7,9 +7,10 @@@ target.path = $$[QT_INSTALL_EXAMPLES]/q
  sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS part3.pro
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/tutorials/addressbook/part3
  INSTALLS += target sources
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -7,10 -7,9 +7,10 @@@ target.path = $$[QT_INSTALL_EXAMPLES]/q
  sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS part4.pro
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/tutorials/addressbook/part4
  INSTALLS += target sources
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -9,10 -9,9 +9,10 @@@ target.path = $$[QT_INSTALL_EXAMPLES]/q
  sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS part5.pro
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/tutorials/addressbook/part5
  INSTALLS += target sources
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -9,10 -9,9 +9,10 @@@ target.path = $$[QT_INSTALL_EXAMPLES]/q
  sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS part6.pro
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/tutorials/addressbook/part6
  INSTALLS += target sources
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -9,10 -9,9 +9,10 @@@ target.path = $$[QT_INSTALL_EXAMPLES]/q
  sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS part7.pro
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/tutorials/addressbook/part7
  INSTALLS += target sources
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -5,10 -5,9 +5,10 @@@ target.path = $$[QT_INSTALL_EXAMPLES]/q
  sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS childwidget.pro
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/tutorials/widgets/childwidget
  INSTALLS += target sources
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -5,10 -5,9 +5,10 @@@ target.path = $$[QT_INSTALL_EXAMPLES]/q
  sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS nestedlayouts.pro
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/tutorials/widgets/nestedlayouts
  INSTALLS += target sources
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -5,10 -5,9 +5,10 @@@ target.path = $$[QT_INSTALL_EXAMPLES]/q
  sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS toplevel.pro
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/tutorials/widgets/toplevel
  INSTALLS += target sources
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -5,10 -5,9 +5,10 @@@ target.path = $$[QT_INSTALL_EXAMPLES]/q
  sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS windowlayout.pro
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/tutorials/widgets/windowlayout
  INSTALLS += target sources
 +QT += widgets
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -14,6 -14,5 +14,6 @@@ symbian 
      TARGET.UID3 = 0xA000D7C1
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
@@@ -12,6 -12,5 +12,6 @@@ symbian 
      TARGET.UID3 = 0xA000A64F
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
@@@ -14,6 -14,5 +14,6 @@@ symbian 
      TARGET.UID3 = 0xA000C602
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
@@@ -12,8 -12,7 +12,8 @@@ symbian 
      TARGET.UID3 = 0xA000C603
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -7,9 -7,8 +7,9 @@@ sources.files = $$SOURCES $$HEADERS *.p
  sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/widgets/codeeditor
  INSTALLS += target sources
  
- symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ symbian: CONFIG += qt_example
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -25,8 -25,7 +25,8 @@@ wince*: 
      }
      DEPLOYMENT += imageFiles
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -16,8 -16,7 +16,8 @@@ symbian: TARGET = imageviewerexampl
  wince*: {
     DEPLOYMENT_PLUGIN += qjpeg qmng qgif
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -12,8 -12,7 +12,8 @@@ symbian 
      TARGET.UID3 = 0xA000C604
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -17,8 -17,7 +17,8 @@@ wince*: 
     DEPLOYMENT_PLUGIN += qmng
  }
  
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -12,8 -12,7 +12,8 @@@ symbian 
      TARGET.UID3 = 0xA000C605
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
  symbian: warning(This example might not fully work on Symbian platform)
  maemo5: warning(This example might not fully work on Maemo platform)
@@@ -13,6 -13,5 +13,6 @@@ symbian 
      TARGET.UID3 = 0xA000CF6B
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
@@@ -16,6 -16,5 +16,6 @@@ symbian 
      TARGET.UID3 = 0xA000C606
      CONFIG += qt_example
  }
- maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)
 +QT += widgets
+ maemo5: CONFIG += qt_example
  
Simple merge
index 261eadb,0000000..65490e0
mode 100644,000000..100644
--- /dev/null
@@@ -1,3 -1,0 +1,5 @@@
++DEFINES += QT_COMPILES_IN_HARFBUZZ
++
 +contains(QT_CONFIG, system-freetype) {
 +    LIBS += -lfreetype
 +}
diff --cc src/gui/gui.pro
Simple merge
@@@ -3051,40 -3056,9 +3048,9 @@@ void QRasterPaintEngine::drawTextItem(c
      ensurePen();
      ensureState();
  
 -#if defined (Q_WS_WIN) || defined(Q_WS_MAC)
 +#if defined (Q_OS_WIN) || defined(Q_WS_MAC)
  
-     bool drawCached = true;
-     if (s->matrix.type() >= QTransform::TxProject)
-         drawCached = false;
-     // don't try to cache huge fonts
-     const qreal pixelSize = ti.fontEngine->fontDef.pixelSize;
-     if (pixelSize * pixelSize * qAbs(s->matrix.determinant()) >= 64 * 64)
-         drawCached = false;
-     // ### Remove the TestFontEngine and Box engine crap, in these
-     // ### cases we should delegate painting to the font engine
-     // ### directly...
- /*
-     #if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
-     conQFontEngine::Type fontEngineType = ti.fontEngine->type();
-     // qDebug() << "type" << fontEngineType << s->matrix.type();
-     if ((fontEngineType == QFontEngine::Win && !((QFontEngineWin *) ti.fontEngine)->ttf && s->matrix.type() > QTransform::TxTranslate)
-         || (s->matrix.type() <= QTransform::TxTranslate
-             && (fontEngineType == QFontEngine::TestFontEngine
-                 || fontEngineType == QFontEngine::Box))) {
-             drawCached = false;
-     }
- #else
- */
-     if (s->matrix.type() > QTransform::TxTranslate)
-         drawCached = false;
- // #endif
-     if (drawCached) {
-         QRasterPaintEngineState *s = state();
+     if (!supportsTransformations(ti.fontEngine)) {
          QVarLengthArray<QFixedPoint> positions;
          QVarLengthArray<glyph_t> glyphs;
  
@@@ -237,6 -241,14 +237,9 @@@ public
  
      QPoint coordinateOffset() const;
  
 -#if defined(Q_WS_QWS) && !defined(QT_NO_RASTERCALLBACKS)
 -    virtual void drawColorSpans(const QSpan *spans, int count, uint color);
 -    virtual void drawBufferSpan(const uint *buffer, int bufsize,
 -                                int x, int y, int length, uint const_alpha);
 -#endif
+     bool supportsTransformations(const QFontEngine *fontEngine) const;
+     bool supportsTransformations(qreal pixelSize, const QTransform &m) const;
  protected:
      QRasterPaintEngine(QRasterPaintEnginePrivate &d, QPaintDevice *);
  private:
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -1,6 -1,8 +1,8 @@@
+ load(qt_module)
  TARGET     = QtOpenGL
  QPRO_PWD   = $$PWD
 -QT         = core-private gui-private
 +QT         = core-private gui-private widgets-private
  
  CONFIG += module
  MODULE_PRI = ../modules/qt_opengl.pri
@@@ -1,6 -1,8 +1,8 @@@
+ load(qt_module)
  TARGET = QtTest
  QPRO_PWD = $$PWD
 -QT = core
 +QT = core gui widgets
  
  CONFIG += module
  MODULE_PRI = ../modules/qt_testlib.pri
index d3df5c9,0000000..9d6e348
mode 100644,000000..100644
--- /dev/null
@@@ -1,3486 -1,0 +1,3555 @@@
-     if (!editText.contains(QLatin1Char('"')))
 +/****************************************************************************
 +**
 +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
 +** All rights reserved.
 +** Contact: Nokia Corporation (qt-info@nokia.com)
 +**
 +** This file is part of the QtGui module of the Qt Toolkit.
 +**
 +** $QT_BEGIN_LICENSE:LGPL$
 +** GNU Lesser General Public License Usage
 +** This file may be used under the terms of the GNU Lesser General Public
 +** License version 2.1 as published by the Free Software Foundation and
 +** appearing in the file LICENSE.LGPL included in the packaging of this
 +** file. Please review the following information to ensure the GNU Lesser
 +** General Public License version 2.1 requirements will be met:
 +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 +**
 +** In addition, as a special exception, Nokia gives you certain additional
 +** rights. These rights are described in the Nokia Qt LGPL Exception
 +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
 +**
 +** GNU General Public License Usage
 +** Alternatively, this file may be used under the terms of the GNU General
 +** Public License version 3.0 as published by the Free Software Foundation
 +** and appearing in the file LICENSE.GPL included in the packaging of this
 +** file. Please review the following information to ensure the GNU General
 +** Public License version 3.0 requirements will be met:
 +** http://www.gnu.org/copyleft/gpl.html.
 +**
 +** Other Usage
 +** Alternatively, this file may be used in accordance with the terms and
 +** conditions contained in a signed written agreement between you and Nokia.
 +**
 +**
 +**
 +**
 +**
 +** $QT_END_LICENSE$
 +**
 +****************************************************************************/
 +
 +#include <qvariant.h>
 +#include <private/qwidgetitemdata_p.h>
 +#include "qfiledialog.h"
 +
 +#ifndef QT_NO_FILEDIALOG
 +#include "qfiledialog_p.h"
 +#include <qfontmetrics.h>
 +#include <qaction.h>
 +#include <qheaderview.h>
 +#include <qshortcut.h>
 +#include <qgridlayout.h>
 +#include <qmenu.h>
 +#include <qmessagebox.h>
 +#include <qinputdialog.h>
 +#include <stdlib.h>
 +#include <qsettings.h>
 +#include <qdebug.h>
 +#include <qapplication.h>
 +#include <qstylepainter.h>
 +#if !defined(Q_WS_WINCE) && !defined(Q_OS_SYMBIAN)
 +#include "ui_qfiledialog.h"
 +#else
 +#define Q_EMBEDDED_SMALLSCREEN
 +#include "ui_qfiledialog_embedded.h"
 +#if defined(Q_OS_WINCE)
 +extern bool qt_priv_ptr_valid;
 +#endif
++#if defined(Q_OS_UNIX)
++#include <pwd.h>
++#endif
 +#endif
 +
 +QT_BEGIN_NAMESPACE
 +
 +Q_GLOBAL_STATIC(QString, lastVisitedDir)
 +
 +/*
 +    \internal
 +
 +    Exported hooks that can be used to customize the static functions.
 + */
 +typedef QString (*_qt_filedialog_existing_directory_hook)(QWidget *parent, const QString &caption, const QString &dir, QFileDialog::Options options);
 +Q_WIDGETS_EXPORT _qt_filedialog_existing_directory_hook qt_filedialog_existing_directory_hook = 0;
 +
 +typedef QString (*_qt_filedialog_open_filename_hook)(QWidget * parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options);
 +Q_WIDGETS_EXPORT _qt_filedialog_open_filename_hook qt_filedialog_open_filename_hook = 0;
 +
 +typedef QStringList (*_qt_filedialog_open_filenames_hook)(QWidget * parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options);
 +Q_WIDGETS_EXPORT _qt_filedialog_open_filenames_hook qt_filedialog_open_filenames_hook = 0;
 +
 +typedef QString (*_qt_filedialog_save_filename_hook)(QWidget * parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options);
 +Q_WIDGETS_EXPORT _qt_filedialog_save_filename_hook qt_filedialog_save_filename_hook = 0;
 +
 +/*!
 +  \class QFileDialog
 +  \brief The QFileDialog class provides a dialog that allow users to select files or directories.
 +  \ingroup standard-dialogs
 +
 +
 +  The QFileDialog class enables a user to traverse the file system in
 +  order to select one or many files or a directory.
 +
 +  The easiest way to create a QFileDialog is to use the static
 +  functions. On Windows, Mac OS X, KDE and GNOME, these static functions will
 +  call the native file dialog when possible.
 +
 +  \snippet doc/src/snippets/code/src_gui_dialogs_qfiledialog.cpp 0
 +
 +  In the above example, a modal QFileDialog is created using a static
 +  function. The dialog initially displays the contents of the "/home/jana"
 +  directory, and displays files matching the patterns given in the
 +  string "Image Files (*.png *.jpg *.bmp)". The parent of the file dialog
 +  is set to \e this, and the window title is set to "Open Image".
 +
 +  If you want to use multiple filters, separate each one with
 +  \e two semicolons. For example:
 +
 +  \snippet doc/src/snippets/code/src_gui_dialogs_qfiledialog.cpp 1
 +
 +  You can create your own QFileDialog without using the static
 +  functions. By calling setFileMode(), you can specify what the user must
 +  select in the dialog:
 +
 +  \snippet doc/src/snippets/code/src_gui_dialogs_qfiledialog.cpp 2
 +
 +  In the above example, the mode of the file dialog is set to
 +  AnyFile, meaning that the user can select any file, or even specify a
 +  file that doesn't exist. This mode is useful for creating a
 +  "Save As" file dialog. Use ExistingFile if the user must select an
 +  existing file, or \l Directory if only a directory may be selected.
 +  See the \l QFileDialog::FileMode enum for the complete list of modes.
 +
 +  The fileMode property contains the mode of operation for the dialog;
 +  this indicates what types of objects the user is expected to select.
 +  Use setNameFilter() to set the dialog's file filter. For example:
 +
 +  \snippet doc/src/snippets/code/src_gui_dialogs_qfiledialog.cpp 3
 +
 +  In the above example, the filter is set to \c{"Images (*.png *.xpm *.jpg)"},
 +  this means that only files with the extension \c png, \c xpm,
 +  or \c jpg will be shown in the QFileDialog. You can apply
 +  several filters by using setNameFilters(). Use selectNameFilter() to select
 +  one of the filters you've given as the file dialog's default filter.
 +
 +  The file dialog has two view modes: \l{QFileDialog::}{List} and
 +  \l{QFileDialog::}{Detail}.
 +  \l{QFileDialog::}{List} presents the contents of the current directory
 +  as a list of file and directory names. \l{QFileDialog::}{Detail} also
 +  displays a list of file and directory names, but provides additional
 +  information alongside each name, such as the file size and modification
 +  date. Set the mode with setViewMode():
 +
 +  \snippet doc/src/snippets/code/src_gui_dialogs_qfiledialog.cpp 4
 +
 +  The last important function you will need to use when creating your
 +  own file dialog is selectedFiles().
 +
 +  \snippet doc/src/snippets/code/src_gui_dialogs_qfiledialog.cpp 5
 +
 +  In the above example, a modal file dialog is created and shown. If
 +  the user clicked OK, the file they selected is put in \c fileName.
 +
 +  The dialog's working directory can be set with setDirectory().
 +  Each file in the current directory can be selected using
 +  the selectFile() function.
 +
 +  The \l{dialogs/standarddialogs}{Standard Dialogs} example shows
 +  how to use QFileDialog as well as other built-in Qt dialogs.
 +
 +  \sa QDir, QFileInfo, QFile, QPrintDialog, QColorDialog, QFontDialog, {Standard Dialogs Example},
 +      {Application Example}
 +*/
 +
 +/*!
 +    \enum QFileDialog::AcceptMode
 +
 +    \value AcceptOpen
 +    \value AcceptSave
 +*/
 +
 +/*!
 +    \enum QFileDialog::ViewMode
 +
 +    This enum describes the view mode of the file dialog; i.e. what
 +    information about each file will be displayed.
 +
 +    \value Detail Displays an icon, a name, and details for each item in
 +                  the directory.
 +    \value List   Displays only an icon and a name for each item in the
 +                  directory.
 +
 +    \sa setViewMode()
 +*/
 +
 +/*!
 +    \enum QFileDialog::FileMode
 +
 +    This enum is used to indicate what the user may select in the file
 +    dialog; i.e. what the dialog will return if the user clicks OK.
 +
 +    \value AnyFile        The name of a file, whether it exists or not.
 +    \value ExistingFile   The name of a single existing file.
 +    \value Directory      The name of a directory. Both files and
 +                          directories are displayed.
 +    \value ExistingFiles  The names of zero or more existing files.
 +
 +    This value is obsolete since Qt 4.5:
 +
 +    \value DirectoryOnly  Use \c Directory and setOption(ShowDirsOnly, true) instead.
 +
 +    \sa setFileMode()
 +*/
 +
 +/*!
 +    \enum QFileDialog::Option
 +
 +    \value ShowDirsOnly Only show directories in the file dialog. By
 +    default both files and directories are shown. (Valid only in the
 +    \l Directory file mode.)
 +
 +    \value DontResolveSymlinks Don't resolve symlinks in the file
 +    dialog. By default symlinks are resolved.
 +
 +    \value DontConfirmOverwrite Don't ask for confirmation if an
 +    existing file is selected.  By default confirmation is requested.
 +
 +    \value DontUseNativeDialog Don't use the native file dialog. By
 +    default, the native file dialog is used unless you use a subclass
 +    of QFileDialog that contains the Q_OBJECT macro.
 +
 +    \value ReadOnly Indicates that the model is readonly.
 +
 +    \value HideNameFilterDetails Indicates if the file name filter details are
 +    hidden or not.
 +
 +    \value DontUseSheet In previous versions of Qt, the static
 +    functions would create a sheet by default if the static function
 +    was given a parent. This is no longer supported and does nothing in Qt 4.5, The
 +    static functions will always be an application modal dialog. If
 +    you want to use sheets, use QFileDialog::open() instead.
 +
 +*/
 +
 +/*!
 +  \enum QFileDialog::DialogLabel
 +
 +  \value LookIn
 +  \value FileName
 +  \value FileType
 +  \value Accept
 +  \value Reject
 +*/
 +
 +/*!
 +    \fn void QFileDialog::filesSelected(const QStringList &selected)
 +
 +    When the selection changes and the dialog is accepted, this signal is
 +    emitted with the (possibly empty) list of \a selected files.
 +
 +    \sa currentChanged(), QDialog::Accepted
 +*/
 +
 +
 +/*!
 +    \fn void QFileDialog::fileSelected(const QString &file)
 +
 +    When the selection changes and the dialog is accepted, this signal is
 +    emitted with the (possibly empty) selected \a file.
 +
 +    \sa currentChanged(), QDialog::Accepted
 +*/
 +
 +
 +/*!
 +    \fn void QFileDialog::currentChanged(const QString &path)
 +
 +    When the current file changes, this signal is emitted with the
 +    new file name as the \a path parameter.
 +
 +    \sa filesSelected()
 +*/
 +
 +/*!
 +  \fn void QFileDialog::directoryEntered(const QString &directory)
 +  \since 4.3
 +
 +  This signal is emitted when the user enters a \a directory.
 +*/
 +
 +/*!
 +  \fn void QFileDialog::filterSelected(const QString &filter)
 +  \since 4.3
 +
 +  This signal is emitted when the user selects a \a filter.
 +*/
 +
 +#if defined(Q_WS_WIN) || defined(Q_WS_MAC)
 +bool Q_WIDGETS_EXPORT qt_use_native_dialogs = true; // for the benefit of testing tools, until we have a proper API
 +#endif
 +
 +QT_BEGIN_INCLUDE_NAMESPACE
 +#ifdef Q_WS_WIN
 +#include <qwindowsstyle.h>
 +#endif
 +#include <qshortcut.h>
 +#ifdef Q_WS_MAC
 +#include <qmacstyle_mac.h>
 +#endif
 +QT_END_INCLUDE_NAMESPACE
 +
 +/*!
 +    \fn QFileDialog::QFileDialog(QWidget *parent, Qt::WindowFlags flags)
 +
 +    Constructs a file dialog with the given \a parent and widget \a flags.
 +*/
 +QFileDialog::QFileDialog(QWidget *parent, Qt::WindowFlags f)
 +    : QDialog(*new QFileDialogPrivate, parent, f)
 +{
 +    Q_D(QFileDialog);
 +    d->init();
 +    d->lineEdit()->selectAll();
 +}
 +
 +/*!
 +    Constructs a file dialog with the given \a parent and \a caption that
 +    initially displays the contents of the specified \a directory.
 +    The contents of the directory are filtered before being shown in the
 +    dialog, using a semicolon-separated list of filters specified by
 +    \a filter.
 +*/
 +QFileDialog::QFileDialog(QWidget *parent,
 +                     const QString &caption,
 +                     const QString &directory,
 +                     const QString &filter)
 +    : QDialog(*new QFileDialogPrivate, parent, 0)
 +{
 +    Q_D(QFileDialog);
 +    d->init(directory, filter, caption);
 +    d->lineEdit()->selectAll();
 +}
 +
 +/*!
 +    \internal
 +*/
 +QFileDialog::QFileDialog(const QFileDialogArgs &args)
 +    : QDialog(*new QFileDialogPrivate, args.parent, 0)
 +{
 +    Q_D(QFileDialog);
 +    d->init(args.directory, args.filter, args.caption);
 +    setFileMode(args.mode);
 +    setOptions(args.options);
 +    selectFile(args.selection);
 +    d->lineEdit()->selectAll();
 +}
 +
 +/*!
 +    Destroys the file dialog.
 +*/
 +QFileDialog::~QFileDialog()
 +{
 +    Q_D(QFileDialog);
 +#ifndef QT_NO_SETTINGS
 +    QSettings settings(QSettings::UserScope, QLatin1String("Trolltech"));
 +    settings.beginGroup(QLatin1String("Qt"));
 +    settings.setValue(QLatin1String("filedialog"), saveState());
 +#endif
 +    d->deleteNativeDialog_sys();
 +}
 +
 +/*!
 +    \since 4.3
 +    Sets the \a urls that are located in the sidebar.
 +
 +    For instance:
 +
 +    \snippet doc/src/snippets/filedialogurls.cpp 0
 +
 +    The file dialog will then look like this:
 +
 +    \image filedialogurls.png
 +
 +    \sa sidebarUrls()
 +*/
 +void QFileDialog::setSidebarUrls(const QList<QUrl> &urls)
 +{
 +    Q_D(QFileDialog);
 +    d->qFileDialogUi->sidebar->setUrls(urls);
 +}
 +
 +/*!
 +    \since 4.3
 +    Returns a list of urls that are currently in the sidebar
 +*/
 +QList<QUrl> QFileDialog::sidebarUrls() const
 +{
 +    Q_D(const QFileDialog);
 +    return d->qFileDialogUi->sidebar->urls();
 +}
 +
 +static const qint32 QFileDialogMagic = 0xbe;
 +
 +const char *qt_file_dialog_filter_reg_exp =
 +"^(.*)\\(([a-zA-Z0-9_.*? +;#\\-\\[\\]@\\{\\}/!<>\\$%&=^~:\\|]*)\\)$";
 +
 +/*!
 +    \since 4.3
 +    Saves the state of the dialog's layout, history and current directory.
 +
 +    Typically this is used in conjunction with QSettings to remember the size
 +    for a future session. A version number is stored as part of the data.
 +*/
 +QByteArray QFileDialog::saveState() const
 +{
 +    Q_D(const QFileDialog);
 +    int version = 3;
 +    QByteArray data;
 +    QDataStream stream(&data, QIODevice::WriteOnly);
 +
 +    stream << qint32(QFileDialogMagic);
 +    stream << qint32(version);
 +    stream << d->qFileDialogUi->splitter->saveState();
 +    stream << d->qFileDialogUi->sidebar->urls();
 +    stream << history();
 +    stream << *lastVisitedDir();
 +    stream << d->qFileDialogUi->treeView->header()->saveState();
 +    stream << qint32(viewMode());
 +    return data;
 +}
 +
 +/*!
 +    \since 4.3
 +    Restores the dialogs's layout, history and current directory to the \a state specified.
 +
 +    Typically this is used in conjunction with QSettings to restore the size
 +    from a past session.
 +
 +    Returns false if there are errors
 +*/
 +bool QFileDialog::restoreState(const QByteArray &state)
 +{
 +    Q_D(QFileDialog);
 +    int version = 3;
 +    QByteArray sd = state;
 +    QDataStream stream(&sd, QIODevice::ReadOnly);
 +    if (stream.atEnd())
 +        return false;
 +    QByteArray splitterState;
 +    QByteArray headerData;
 +    QList<QUrl> bookmarks;
 +    QStringList history;
 +    QString currentDirectory;
 +    qint32 marker;
 +    qint32 v;
 +    qint32 viewMode;
 +    stream >> marker;
 +    stream >> v;
 +    if (marker != QFileDialogMagic || v != version)
 +        return false;
 +
 +    stream >> splitterState
 +           >> bookmarks
 +           >> history
 +           >> currentDirectory
 +           >> headerData
 +           >> viewMode;
 +
 +    if (!d->qFileDialogUi->splitter->restoreState(splitterState))
 +        return false;
 +    QList<int> list = d->qFileDialogUi->splitter->sizes();
 +    if (list.count() >= 2 && list.at(0) == 0 && list.at(1) == 0) {
 +        for (int i = 0; i < list.count(); ++i)
 +            list[i] = d->qFileDialogUi->splitter->widget(i)->sizeHint().width();
 +        d->qFileDialogUi->splitter->setSizes(list);
 +    }
 +
 +    d->qFileDialogUi->sidebar->setUrls(bookmarks);
 +    while (history.count() > 5)
 +        history.pop_front();
 +    setHistory(history);
 +    setDirectory(lastVisitedDir()->isEmpty() ? currentDirectory : *lastVisitedDir());
 +    if (!d->qFileDialogUi->treeView->header()->restoreState(headerData))
 +        return false;
 +
 +    setViewMode(ViewMode(viewMode));
 +    return true;
 +}
 +
 +/*!
 +    \reimp
 +*/
 +void QFileDialog::changeEvent(QEvent *e)
 +{
 +    Q_D(QFileDialog);
 +    if (e->type() == QEvent::LanguageChange) {
 +        d->retranslateWindowTitle();
 +        d->retranslateStrings();
 +    }
 +    QDialog::changeEvent(e);
 +}
 +
 +QFileDialogPrivate::QFileDialogPrivate()
 +    :
 +#ifndef QT_NO_PROXYMODEL
 +        proxyModel(0),
 +#endif
 +        model(0),
 +        fileMode(QFileDialog::AnyFile),
 +        acceptMode(QFileDialog::AcceptOpen),
 +        currentHistoryLocation(-1),
 +        renameAction(0),
 +        deleteAction(0),
 +        showHiddenAction(0),
 +        useDefaultCaption(true),
 +        defaultFileTypes(true),
 +        fileNameLabelExplicitlySat(false),
 +        nativeDialogInUse(false),
 +#ifdef Q_WS_MAC
 +        mDelegate(0),
 +#ifndef QT_MAC_USE_COCOA
 +        mDialog(0),
 +        mDialogStarted(false),
 +        mDialogClosed(true),
 +#endif
 +#endif
 +        qFileDialogUi(0)
 +{
 +}
 +
 +QFileDialogPrivate::~QFileDialogPrivate()
 +{
 +}
 +
 +void QFileDialogPrivate::retranslateWindowTitle()
 +{
 +    Q_Q(QFileDialog);
 +    if (!useDefaultCaption || setWindowTitle != q->windowTitle())
 +        return;
 +    if (acceptMode == QFileDialog::AcceptOpen) {
 +        if (fileMode == QFileDialog::DirectoryOnly || fileMode == QFileDialog::Directory)
 +            q->setWindowTitle(QFileDialog::tr("Find Directory"));
 +        else
 +            q->setWindowTitle(QFileDialog::tr("Open"));
 +    } else
 +        q->setWindowTitle(QFileDialog::tr("Save As"));
 +
 +    setWindowTitle = q->windowTitle();
 +}
 +
 +void QFileDialogPrivate::setLastVisitedDirectory(const QString &dir)
 +{
 +    *lastVisitedDir() = dir;
 +}
 +
 +void QFileDialogPrivate::retranslateStrings()
 +{
 +    Q_Q(QFileDialog);
 +    /* WIDGETS */
 +    if (defaultFileTypes)
 +        q->setNameFilter(QFileDialog::tr("All Files (*)"));
 +
 +    QList<QAction*> actions = qFileDialogUi->treeView->header()->actions();
 +    QAbstractItemModel *abstractModel = model;
 +#ifndef QT_NO_PROXYMODEL
 +    if (proxyModel)
 +        abstractModel = proxyModel;
 +#endif
 +    int total = qMin(abstractModel->columnCount(QModelIndex()), actions.count() + 1);
 +    for (int i = 1; i < total; ++i) {
 +        actions.at(i - 1)->setText(QFileDialog::tr("Show ") + abstractModel->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString());
 +    }
 +
 +    /* MENU ACTIONS */
 +    renameAction->setText(QFileDialog::tr("&Rename"));
 +    deleteAction->setText(QFileDialog::tr("&Delete"));
 +    showHiddenAction->setText(QFileDialog::tr("Show &hidden files"));
 +    newFolderAction->setText(QFileDialog::tr("&New Folder"));
 +    qFileDialogUi->retranslateUi(q);
 +
 +    if (!fileNameLabelExplicitlySat){
 +        if (fileMode == QFileDialog::DirectoryOnly || fileMode == QFileDialog::Directory) {
 +            q->setLabelText(QFileDialog::FileName, QFileDialog::tr("Directory:"));
 +        } else {
 +            q->setLabelText(QFileDialog::FileName, QFileDialog::tr("File &name:"));
 +        }
 +        fileNameLabelExplicitlySat = false;
 +    }
 +}
 +
 +void QFileDialogPrivate::emitFilesSelected(const QStringList &files)
 +{
 +    Q_Q(QFileDialog);
 +    emit q->filesSelected(files);
 +    if (files.count() == 1)
 +        emit q->fileSelected(files.first());
 +}
 +
 +bool QFileDialogPrivate::canBeNativeDialog()
 +{
 +    Q_Q(QFileDialog);
 +    if (nativeDialogInUse)
 +        return true;
 +    if (q->testAttribute(Qt::WA_DontShowOnScreen))
 +        return false;
 +    if (opts & QFileDialog::DontUseNativeDialog)
 +        return false;
 +
 +    QLatin1String staticName(QFileDialog::staticMetaObject.className());
 +    QLatin1String dynamicName(q->metaObject()->className());
 +    return (staticName == dynamicName);
 +}
 +
 +/*!
 +    \since 4.5
 +    Sets the given \a option to be enabled if \a on is true; otherwise,
 +    clears the given \a option.
 +
 +    \sa options, testOption()
 +*/
 +void QFileDialog::setOption(Option option, bool on)
 +{
 +    Q_D(QFileDialog);
 +    if (!(d->opts & option) != !on)
 +        setOptions(d->opts ^ option);
 +}
 +
 +/*!
 +    \since 4.5
 +
 +    Returns true if the given \a option is enabled; otherwise, returns
 +    false.
 +
 +    \sa options, setOption()
 +*/
 +bool QFileDialog::testOption(Option option) const
 +{
 +    Q_D(const QFileDialog);
 +    return (d->opts & option) != 0;
 +}
 +
 +/*!
 +    \property QFileDialog::options
 +    \brief the various options that affect the look and feel of the dialog
 +    \since 4.5
 +
 +    By default, all options are disabled.
 +
 +    Options should be set before showing the dialog. Setting them while the
 +    dialog is visible is not guaranteed to have an immediate effect on the
 +    dialog (depending on the option and on the platform).
 +
 +    \sa setOption(), testOption()
 +*/
 +void QFileDialog::setOptions(Options options)
 +{
 +    Q_D(QFileDialog);
 +
 +    Options changed = (options ^ d->opts);
 +    if (!changed)
 +        return;
 +
 +    d->opts = options;
 +    if (changed & DontResolveSymlinks)
 +        d->model->setResolveSymlinks(!(options & DontResolveSymlinks));
 +    if (changed & ReadOnly) {
 +        bool ro = (options & ReadOnly);
 +        d->model->setReadOnly(ro);
 +        d->qFileDialogUi->newFolderButton->setEnabled(!ro);
 +        d->renameAction->setEnabled(!ro);
 +        d->deleteAction->setEnabled(!ro);
 +    }
 +    if (changed & HideNameFilterDetails)
 +        setNameFilters(d->nameFilters);
 +
 +    if (changed & ShowDirsOnly)
 +        setFilter((options & ShowDirsOnly) ? filter() & ~QDir::Files : filter() | QDir::Files);
 +}
 +
 +QFileDialog::Options QFileDialog::options() const
 +{
 +    Q_D(const QFileDialog);
 +    return d->opts;
 +}
 +
 +/*!
 +    \overload
 +
 +    \since 4.5
 +
 +    This function connects one of its signals to the slot specified by \a receiver
 +    and \a member. The specific signal depends is filesSelected() if fileMode is
 +    ExistingFiles and fileSelected() if fileMode is anything else.
 +
 +    The signal will be disconnected from the slot when the dialog is closed.
 +*/
 +void QFileDialog::open(QObject *receiver, const char *member)
 +{
 +    Q_D(QFileDialog);
 +    const char *signal = (fileMode() == ExistingFiles) ? SIGNAL(filesSelected(QStringList))
 +                                                       : SIGNAL(fileSelected(QString));
 +    connect(this, signal, receiver, member);
 +    d->signalToDisconnectOnClose = signal;
 +    d->receiverToDisconnectOnClose = receiver;
 +    d->memberToDisconnectOnClose = member;
 +
 +    QDialog::open();
 +}
 +
 +
 +/*!
 +    \reimp
 +*/
 +void QFileDialog::setVisible(bool visible)
 +{
 +    Q_D(QFileDialog);
 +    if (visible){
 +        if (testAttribute(Qt::WA_WState_ExplicitShowHide) && !testAttribute(Qt::WA_WState_Hidden))
 +            return;
 +    } else if (testAttribute(Qt::WA_WState_ExplicitShowHide) && testAttribute(Qt::WA_WState_Hidden))
 +        return;
 +
 +    if (d->canBeNativeDialog()){
 +        if (d->setVisible_sys(visible)){
 +            d->nativeDialogInUse = true;
 +            // Set WA_DontShowOnScreen so that QDialog::setVisible(visible) below
 +            // updates the state correctly, but skips showing the non-native version:
 +            setAttribute(Qt::WA_DontShowOnScreen);
 +#ifndef QT_NO_FSCOMPLETER
 +            //So the completer don't try to complete and therefore to show a popup
 +            d->completer->setModel(0);
 +#endif
 +        } else {
 +            d->nativeDialogInUse = false;
 +            setAttribute(Qt::WA_DontShowOnScreen, false);
 +#ifndef QT_NO_FSCOMPLETER
 +            if (d->proxyModel != 0)
 +                d->completer->setModel(d->proxyModel);
 +            else
 +                d->completer->setModel(d->model);
 +#endif
 +        }
 +    }
 +
 +    if (!d->nativeDialogInUse)
 +        d->qFileDialogUi->fileNameEdit->setFocus();
 +
 +    QDialog::setVisible(visible);
 +}
 +
 +/*!
 +    \internal
 +    set the directory to url
 +*/
 +void QFileDialogPrivate::_q_goToUrl(const QUrl &url)
 +{
 +    //The shortcut in the side bar may have a parent that is not fetched yet (e.g. an hidden file)
 +    //so we force the fetching
 +    QFileSystemModelPrivate::QFileSystemNode *node = model->d_func()->node(url.toLocalFile(), true);
 +    QModelIndex idx =  model->d_func()->index(node);
 +    _q_enterDirectory(idx);
 +}
 +
 +/*!
 +    \fn void QFileDialog::setDirectory(const QDir &directory)
 +
 +    \overload
 +*/
 +
 +/*!
 +    Sets the file dialog's current \a directory.
 +*/
 +void QFileDialog::setDirectory(const QString &directory)
 +{
 +    Q_D(QFileDialog);
 +    QString newDirectory = directory;
 +    QFileInfo info(directory);
 +    //we remove .. and . from the given path if exist
 +    if (!directory.isEmpty())
 +        newDirectory = QDir::cleanPath(directory);
 +
 +    if (!directory.isEmpty() && newDirectory.isEmpty())
 +        return;
 +
 +    d->setLastVisitedDirectory(newDirectory);
 +
 +    if (d->nativeDialogInUse){
 +        d->setDirectory_sys(newDirectory);
 +        return;
 +    }
 +    if (d->rootPath() == newDirectory)
 +        return;
 +    QModelIndex root = d->model->setRootPath(newDirectory);
 +    d->qFileDialogUi->newFolderButton->setEnabled(d->model->flags(root) & Qt::ItemIsDropEnabled);
 +    if (root != d->rootIndex()) {
 +#ifndef QT_NO_FSCOMPLETER
 +    if (directory.endsWith(QLatin1Char('/')))
 +        d->completer->setCompletionPrefix(newDirectory);
 +    else
 +        d->completer->setCompletionPrefix(newDirectory + QLatin1Char('/'));
 +#endif
 +        d->setRootIndex(root);
 +    }
 +    d->qFileDialogUi->listView->selectionModel()->clear();
 +}
 +
 +/*!
 +    Returns the directory currently being displayed in the dialog.
 +*/
 +QDir QFileDialog::directory() const
 +{
 +    Q_D(const QFileDialog);
 +    return QDir(d->nativeDialogInUse ? d->directory_sys() : d->rootPath());
 +}
 +
 +/*!
 +    Selects the given \a filename in the file dialog.
 +
 +    \sa selectedFiles()
 +*/
 +void QFileDialog::selectFile(const QString &filename)
 +{
 +    Q_D(QFileDialog);
 +    if (filename.isEmpty())
 +        return;
 +
 +    if (d->nativeDialogInUse){
 +        d->selectFile_sys(filename);
 +        return;
 +    }
 +
 +    if (!QDir::isRelativePath(filename)) {
 +        QFileInfo info(filename);
 +        QString filenamePath = info.absoluteDir().path();
 +
 +        if (d->model->rootPath() != filenamePath)
 +            setDirectory(filenamePath);
 +    }
 +
 +    QModelIndex index = d->model->index(filename);
 +    QString file;
 +    if (!index.isValid()) {
 +        // save as dialog where we want to input a default value
 +        QString text = filename;
 +        if (QFileInfo(filename).isAbsolute()) {
 +            QString current = d->rootPath();
 +            text.remove(current);
 +            if (text.at(0) == QDir::separator()
 +#ifdef Q_OS_WIN
 +                //On Windows both cases can happen
 +                || text.at(0) == QLatin1Char('/')
 +#endif
 +                )
 +                text = text.remove(0,1);
 +        }
 +        file = text;
 +    } else {
 +        file = index.data().toString();
 +    }
 +    d->qFileDialogUi->listView->selectionModel()->clear();
 +    if (!isVisible() || !d->lineEdit()->hasFocus())
 +        d->lineEdit()->setText(file);
 +}
 +
++#ifdef Q_OS_UNIX
++Q_AUTOTEST_EXPORT QString qt_tildeExpansion(const QString &path, bool *expanded = 0)
++{
++    if (expanded != 0)
++        *expanded = false;
++    if (!path.startsWith(QLatin1Char('~')))
++        return path;
++    QString ret = path;
++    QStringList tokens = ret.split(QDir::separator());
++    if (tokens.first() == QLatin1String("~")) {
++        ret.replace(0, 1, QDir::homePath());
++    } else {
++        QString userName = tokens.first();
++        userName.remove(0, 1);
++#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_OPENBSD)
++        passwd pw;
++        passwd *tmpPw;
++        char buf[200];
++        const int bufSize = sizeof(buf);
++        int err = getpwnam_r(userName.toLocal8Bit().constData(), &pw, buf, bufSize, &tmpPw);
++        if (err || !tmpPw)
++            return ret;
++        const QString homePath = QString::fromLocal8Bit(pw.pw_dir);
++#else
++        passwd *pw = getpwnam(userName.toLocal8Bit().constData());
++        if (!pw)
++            return ret;
++        const QString homePath = QString::fromLocal8Bit(pw->pw_dir);
++#endif
++        ret.replace(0, tokens.first().length(), homePath);
++    }
++    if (expanded != 0)
++        *expanded = true;
++    return ret;
++}
++#endif
++
 +/**
 +    Returns the text in the line edit which can be one or more file names
 +  */
 +QStringList QFileDialogPrivate::typedFiles() const
 +{
++    Q_Q(const QFileDialog);
 +    QStringList files;
 +    QString editText = lineEdit()->text();
-     else {
++    if (!editText.contains(QLatin1Char('"'))) {
++#ifdef Q_OS_UNIX
++        const QString prefix = q->directory().absolutePath() + QDir::separator();
++        if (QFile::exists(prefix + editText))
++            files << editText;
++        else
++            files << qt_tildeExpansion(editText);
++#else
 +        files << editText;
-     if (path[0] == sep[0]) // read the "/" at the beginning as the split removed it
++#endif
++    } else {
 +        // " is used to separate files like so: "file1" "file2" "file3" ...
 +        // ### need escape character for filenames with quotes (")
 +        QStringList tokens = editText.split(QLatin1Char('\"'));
 +        for (int i=0; i<tokens.size(); ++i) {
 +            if ((i % 2) == 0)
 +                continue; // Every even token is a separator
++#ifdef Q_OS_UNIX
++            const QString token = tokens.at(i);
++            const QString prefix = q->directory().absolutePath() + QDir::separator();
++            if (QFile::exists(prefix + token))
++                files << token;
++            else
++                files << qt_tildeExpansion(token);
++#else
 +            files << toInternal(tokens.at(i));
++#endif
 +        }
 +    }
 +    return addDefaultSuffixToFiles(files);
 +}
 +
 +QStringList QFileDialogPrivate::addDefaultSuffixToFiles(const QStringList filesToFix) const
 +{
 +    QStringList files;
 +    for (int i=0; i<filesToFix.size(); ++i) {
 +        QString name = toInternal(filesToFix.at(i));
 +        QFileInfo info(name);
 +        // if the filename has no suffix, add the default suffix
 +        if (!defaultSuffix.isEmpty() && !info.isDir() && name.lastIndexOf(QLatin1Char('.')) == -1)
 +            name += QLatin1Char('.') + defaultSuffix;
 +        if (info.isAbsolute()) {
 +            files.append(name);
 +        } else {
 +            // at this point the path should only have Qt path separators.
 +            // This check is needed since we might be at the root directory
 +            // and on Windows it already ends with slash.
 +            QString path = rootPath();
 +            if (!path.endsWith(QLatin1Char('/')))
 +                path += QLatin1Char('/');
 +            path += name;
 +            files.append(path);
 +        }
 +    }
 +    return files;
 +}
 +
 +
 +/*!
 +    Returns a list of strings containing the absolute paths of the
 +    selected files in the dialog. If no files are selected, or
 +    the mode is not ExistingFiles or ExistingFile, selectedFiles() contains the current path in the viewport.
 +
 +    \sa selectedNameFilter(), selectFile()
 +*/
 +QStringList QFileDialog::selectedFiles() const
 +{
 +    Q_D(const QFileDialog);
 +    if (d->nativeDialogInUse)
 +        return d->addDefaultSuffixToFiles(d->selectedFiles_sys());
 +
 +    QModelIndexList indexes = d->qFileDialogUi->listView->selectionModel()->selectedRows();
 +    QStringList files;
 +    for (int i = 0; i < indexes.count(); ++i)
 +        files.append(indexes.at(i).data(QFileSystemModel::FilePathRole).toString());
 +
 +    if (files.isEmpty() && !d->lineEdit()->text().isEmpty())
 +        files = d->typedFiles();
 +
 +    if (files.isEmpty() && !(d->fileMode == ExistingFile || d->fileMode == ExistingFiles))
 +        files.append(d->rootIndex().data(QFileSystemModel::FilePathRole).toString());
 +    return files;
 +}
 +
 +/*
 +    Makes a list of filters from ;;-separated text.
 +    Used by the mac and windows implementations
 +*/
 +QStringList qt_make_filter_list(const QString &filter)
 +{
 +    QString f(filter);
 +
 +    if (f.isEmpty())
 +        return QStringList();
 +
 +    QString sep(QLatin1String(";;"));
 +    int i = f.indexOf(sep, 0);
 +    if (i == -1) {
 +        if (f.indexOf(QLatin1Char('\n'), 0) != -1) {
 +            sep = QLatin1Char('\n');
 +            i = f.indexOf(sep, 0);
 +        }
 +    }
 +
 +    return f.split(sep);
 +}
 +
 +/*!
 +    \since 4.4
 +
 +    Sets the filter used in the file dialog to the given \a filter.
 +
 +    If \a filter contains a pair of parentheses containing one or more
 +    of \bold{anything*something}, separated by spaces, then only the
 +    text contained in the parentheses is used as the filter. This means
 +    that these calls are all equivalent:
 +
 +    \snippet doc/src/snippets/code/src_gui_dialogs_qfiledialog.cpp 6
 +
 +    \sa setNameFilters()
 +*/
 +void QFileDialog::setNameFilter(const QString &filter)
 +{
 +    setNameFilters(qt_make_filter_list(filter));
 +}
 +
 +/*!
 +  \obsolete
 +
 +  Use setNameFilter() instead.
 +*/
 +void QFileDialog::setFilter(const QString &filter)
 +{
 +    setNameFilter(filter);
 +}
 +
 +/*!
 +    \property QFileDialog::nameFilterDetailsVisible
 +    \obsolete
 +    \brief This property holds whether the filter details is shown or not.
 +    \since 4.4
 +
 +    When this property is true (the default), the filter details are shown
 +    in the combo box.  When the property is set to false, these are hidden.
 +
 +    Use setOption(HideNameFilterDetails, !\e enabled) or
 +    !testOption(HideNameFilterDetails).
 +*/
 +void QFileDialog::setNameFilterDetailsVisible(bool enabled)
 +{
 +    setOption(HideNameFilterDetails, !enabled);
 +}
 +
 +bool QFileDialog::isNameFilterDetailsVisible() const
 +{
 +    return !testOption(HideNameFilterDetails);
 +}
 +
 +
 +/*
 +    Strip the filters by removing the details, e.g. (*.*).
 +*/
 +QStringList qt_strip_filters(const QStringList &filters)
 +{
 +    QStringList strippedFilters;
 +    QRegExp r(QString::fromLatin1(qt_file_dialog_filter_reg_exp));
 +    for (int i = 0; i < filters.count(); ++i) {
 +        QString filterName;
 +        int index = r.indexIn(filters[i]);
 +        if (index >= 0)
 +            filterName = r.cap(1);
 +        strippedFilters.append(filterName.simplified());
 +    }
 +    return strippedFilters;
 +}
 +
 +
 +/*!
 +    \since 4.4
 +
 +    Sets the \a filters used in the file dialog.
 +
 +    \snippet doc/src/snippets/code/src_gui_dialogs_qfiledialog.cpp 7
 +*/
 +void QFileDialog::setNameFilters(const QStringList &filters)
 +{
 +    Q_D(QFileDialog);
 +    d->defaultFileTypes = (filters == QStringList(QFileDialog::tr("All Files (*)")));
 +    QStringList cleanedFilters;
 +    for (int i = 0; i < filters.count(); ++i) {
 +        cleanedFilters << filters[i].simplified();
 +    }
 +    d->nameFilters = cleanedFilters;
 +
 +    if (d->nativeDialogInUse){
 +        d->setNameFilters_sys(cleanedFilters);
 +        return;
 +    }
 +
 +    d->qFileDialogUi->fileTypeCombo->clear();
 +    if (cleanedFilters.isEmpty())
 +        return;
 +
 +    if (testOption(HideNameFilterDetails))
 +        d->qFileDialogUi->fileTypeCombo->addItems(qt_strip_filters(cleanedFilters));
 +    else
 +        d->qFileDialogUi->fileTypeCombo->addItems(cleanedFilters);
 +
 +    d->_q_useNameFilter(0);
 +}
 +
 +/*!
 +    \obsolete
 +
 +    Use setNameFilters() instead.
 +*/
 +void QFileDialog::setFilters(const QStringList &filters)
 +{
 +    setNameFilters(filters);
 +}
 +
 +/*!
 +    \since 4.4
 +
 +    Returns the file type filters that are in operation on this file
 +    dialog.
 +*/
 +QStringList QFileDialog::nameFilters() const
 +{
 +    return d_func()->nameFilters;
 +}
 +
 +/*!
 +    \obsolete
 +
 +    Use nameFilters() instead.
 +*/
 +
 +QStringList QFileDialog::filters() const
 +{
 +    return nameFilters();
 +}
 +
 +/*!
 +    \since 4.4
 +
 +    Sets the current file type \a filter. Multiple filters can be
 +    passed in \a filter by separating them with semicolons or spaces.
 +
 +    \sa setNameFilter(), setNameFilters(), selectedNameFilter()
 +*/
 +void QFileDialog::selectNameFilter(const QString &filter)
 +{
 +    Q_D(QFileDialog);
 +    if (d->nativeDialogInUse) {
 +        d->selectNameFilter_sys(filter);
 +        return;
 +    }
 +    int i;
 +    if (testOption(HideNameFilterDetails)) {
 +        i = d->qFileDialogUi->fileTypeCombo->findText(qt_strip_filters(qt_make_filter_list(filter)).first());
 +    } else {
 +        i = d->qFileDialogUi->fileTypeCombo->findText(filter);
 +    }
 +    if (i >= 0) {
 +        d->qFileDialogUi->fileTypeCombo->setCurrentIndex(i);
 +        d->_q_useNameFilter(d->qFileDialogUi->fileTypeCombo->currentIndex());
 +    }
 +}
 +
 +/*!
 +    \obsolete
 +
 +    Use selectNameFilter() instead.
 +*/
 +
 +void QFileDialog::selectFilter(const QString &filter)
 +{
 +    selectNameFilter(filter);
 +}
 +
 +/*!
 +    \since 4.4
 +
 +    Returns the filter that the user selected in the file dialog.
 +
 +    \sa selectedFiles()
 +*/
 +QString QFileDialog::selectedNameFilter() const
 +{
 +    Q_D(const QFileDialog);
 +    if (d->nativeDialogInUse)
 +        return d->selectedNameFilter_sys();
 +
 +    return d->qFileDialogUi->fileTypeCombo->currentText();
 +}
 +
 +/*!
 +    \obsolete
 +
 +    Use selectedNameFilter() instead.
 +*/
 +QString QFileDialog::selectedFilter() const
 +{
 +    return selectedNameFilter();
 +}
 +
 +/*!
 +    \since 4.4
 +
 +    Returns the filter that is used when displaying files.
 +
 +    \sa setFilter()
 +*/
 +QDir::Filters QFileDialog::filter() const
 +{
 +    Q_D(const QFileDialog);
 +    return d->model->filter();
 +}
 +
 +/*!
 +    \since 4.4
 +
 +    Sets the filter used by the model to \a filters. The filter is used
 +    to specify the kind of files that should be shown.
 +
 +    \sa filter()
 +*/
 +
 +void QFileDialog::setFilter(QDir::Filters filters)
 +{
 +    Q_D(QFileDialog);
 +    d->model->setFilter(filters);
 +    if (d->nativeDialogInUse){
 +        d->setFilter_sys();
 +        return;
 +    }
 +
 +    d->showHiddenAction->setChecked((filters & QDir::Hidden));
 +}
 +
 +/*!
 +    \property QFileDialog::viewMode
 +    \brief the way files and directories are displayed in the dialog
 +
 +    By default, the \c Detail mode is used to display information about
 +    files and directories.
 +
 +    \sa ViewMode
 +*/
 +void QFileDialog::setViewMode(QFileDialog::ViewMode mode)
 +{
 +    Q_D(QFileDialog);
 +    if (mode == Detail)
 +        d->_q_showDetailsView();
 +    else
 +        d->_q_showListView();
 +}
 +
 +QFileDialog::ViewMode QFileDialog::viewMode() const
 +{
 +    Q_D(const QFileDialog);
 +    return (d->qFileDialogUi->stackedWidget->currentWidget() == d->qFileDialogUi->listView->parent() ? QFileDialog::List : QFileDialog::Detail);
 +}
 +
 +/*!
 +    \property QFileDialog::fileMode
 +    \brief the file mode of the dialog
 +
 +    The file mode defines the number and type of items that the user is
 +    expected to select in the dialog.
 +
 +    By default, this property is set to AnyFile.
 +
 +    This function will set the labels for the FileName and
 +    \l{QFileDialog::}{Accept} \l{DialogLabel}s. It is possible to set
 +    custom text after the call to setFileMode().
 +
 +    \sa FileMode
 +*/
 +void QFileDialog::setFileMode(QFileDialog::FileMode mode)
 +{
 +    Q_D(QFileDialog);
 +    d->fileMode = mode;
 +    d->retranslateWindowTitle();
 +
 +    // keep ShowDirsOnly option in sync with fileMode (BTW, DirectoryOnly is obsolete)
 +    setOption(ShowDirsOnly, mode == DirectoryOnly);
 +
 +    // set selection mode and behavior
 +    QAbstractItemView::SelectionMode selectionMode;
 +    if (mode == QFileDialog::ExistingFiles)
 +        selectionMode = QAbstractItemView::ExtendedSelection;
 +    else
 +        selectionMode = QAbstractItemView::SingleSelection;
 +    d->qFileDialogUi->listView->setSelectionMode(selectionMode);
 +    d->qFileDialogUi->treeView->setSelectionMode(selectionMode);
 +    // set filter
 +    d->model->setFilter(d->filterForMode(filter()));
 +    // setup file type for directory
 +    QString buttonText = (d->acceptMode == AcceptOpen ? tr("&Open") : tr("&Save"));
 +    if (mode == DirectoryOnly || mode == Directory) {
 +        d->qFileDialogUi->fileTypeCombo->clear();
 +        d->qFileDialogUi->fileTypeCombo->addItem(tr("Directories"));
 +        d->qFileDialogUi->fileTypeCombo->setEnabled(false);
 +
 +        if (!d->fileNameLabelExplicitlySat){
 +            setLabelText(FileName, tr("Directory:"));
 +            d->fileNameLabelExplicitlySat = false;
 +        }
 +        buttonText = tr("&Choose");
 +    } else {
 +        if (!d->fileNameLabelExplicitlySat){
 +            setLabelText(FileName, tr("File &name:"));
 +            d->fileNameLabelExplicitlySat = false;
 +        }
 +    }
 +    setLabelText(Accept, buttonText);
 +    if (d->nativeDialogInUse){
 +        d->setFilter_sys();
 +        return;
 +    }
 +
 +    d->qFileDialogUi->fileTypeCombo->setEnabled(!testOption(ShowDirsOnly));
 +    d->_q_updateOkButton();
 +}
 +
 +QFileDialog::FileMode QFileDialog::fileMode() const
 +{
 +    Q_D(const QFileDialog);
 +    return d->fileMode;
 +}
 +
 +/*!
 +    \property QFileDialog::acceptMode
 +    \brief the accept mode of the dialog
 +
 +    The action mode defines whether the dialog is for opening or saving files.
 +
 +    By default, this property is set to \l{AcceptOpen}.
 +
 +    \sa AcceptMode
 +*/
 +void QFileDialog::setAcceptMode(QFileDialog::AcceptMode mode)
 +{
 +    Q_D(QFileDialog);
 +    d->acceptMode = mode;
 +    bool directoryMode = (d->fileMode == Directory || d->fileMode == DirectoryOnly);
 +    QDialogButtonBox::StandardButton button = (mode == AcceptOpen ? QDialogButtonBox::Open : QDialogButtonBox::Save);
 +    d->qFileDialogUi->buttonBox->setStandardButtons(button | QDialogButtonBox::Cancel);
 +    d->qFileDialogUi->buttonBox->button(button)->setEnabled(false);
 +    d->_q_updateOkButton();
 +    if (mode == AcceptOpen && directoryMode)
 +        setLabelText(Accept, tr("&Choose"));
 +    else
 +        setLabelText(Accept, (mode == AcceptOpen ? tr("&Open") : tr("&Save")));
 +    if (mode == AcceptSave) {
 +        d->qFileDialogUi->lookInCombo->setEditable(false);
 +    }
 +    d->retranslateWindowTitle();
 +#if defined(Q_WS_MAC)
 +    d->deleteNativeDialog_sys();
 +    setAttribute(Qt::WA_DontShowOnScreen, false);
 +#endif
 +}
 +
 +/*
 +    Returns the file system model index that is the root index in the
 +    views
 +*/
 +QModelIndex QFileDialogPrivate::rootIndex() const {
 +    return mapToSource(qFileDialogUi->listView->rootIndex());
 +}
 +
 +QAbstractItemView *QFileDialogPrivate::currentView() const {
 +    if (!qFileDialogUi->stackedWidget)
 +        return 0;
 +    if (qFileDialogUi->stackedWidget->currentWidget() == qFileDialogUi->listView->parent())
 +        return qFileDialogUi->listView;
 +    return qFileDialogUi->treeView;
 +}
 +
 +QLineEdit *QFileDialogPrivate::lineEdit() const {
 +    return (QLineEdit*)qFileDialogUi->fileNameEdit;
 +}
 +
 +/*
 +    Sets the view root index to be the file system model index
 +*/
 +void QFileDialogPrivate::setRootIndex(const QModelIndex &index) const {
 +    Q_ASSERT(index.isValid() ? index.model() == model : true);
 +    QModelIndex idx = mapFromSource(index);
 +    qFileDialogUi->treeView->setRootIndex(idx);
 +    qFileDialogUi->listView->setRootIndex(idx);
 +}
 +/*
 +    Select a file system model index
 +    returns the index that was selected (or not depending upon sortfilterproxymodel)
 +*/
 +QModelIndex QFileDialogPrivate::select(const QModelIndex &index) const {
 +    Q_ASSERT(index.isValid() ? index.model() == model : true);
 +
 +    QModelIndex idx = mapFromSource(index);
 +    if (idx.isValid() && !qFileDialogUi->listView->selectionModel()->isSelected(idx))
 +        qFileDialogUi->listView->selectionModel()->select(idx,
 +            QItemSelectionModel::Select | QItemSelectionModel::Rows);
 +    return idx;
 +}
 +
 +QFileDialog::AcceptMode QFileDialog::acceptMode() const
 +{
 +    Q_D(const QFileDialog);
 +    return d->acceptMode;
 +}
 +
 +/*!
 +    \property QFileDialog::readOnly
 +    \obsolete
 +    \brief Whether the filedialog is read-only
 +
 +    If this property is set to false, the file dialog will allow renaming,
 +    and deleting of files and directories and creating directories.
 +
 +    Use setOption(ReadOnly, \e enabled) or testOption(ReadOnly) instead.
 +*/
 +void QFileDialog::setReadOnly(bool enabled)
 +{
 +    setOption(ReadOnly, enabled);
 +}
 +
 +bool QFileDialog::isReadOnly() const
 +{
 +    return testOption(ReadOnly);
 +}
 +
 +/*!
 +    \property QFileDialog::resolveSymlinks
 +    \obsolete
 +    \brief whether the filedialog should resolve shortcuts
 +
 +    If this property is set to true, the file dialog will resolve
 +    shortcuts or symbolic links.
 +
 +    Use setOption(DontResolveSymlinks, !\a enabled) or
 +    !testOption(DontResolveSymlinks).
 +*/
 +void QFileDialog::setResolveSymlinks(bool enabled)
 +{
 +    setOption(DontResolveSymlinks, !enabled);
 +}
 +
 +bool QFileDialog::resolveSymlinks() const
 +{
 +    return !testOption(DontResolveSymlinks);
 +}
 +
 +/*!
 +    \property QFileDialog::confirmOverwrite
 +    \obsolete
 +    \brief whether the filedialog should ask before accepting a selected file,
 +    when the accept mode is AcceptSave
 +
 +    Use setOption(DontConfirmOverwrite, !\e enabled) or
 +    !testOption(DontConfirmOverwrite) instead.
 +*/
 +void QFileDialog::setConfirmOverwrite(bool enabled)
 +{
 +    setOption(DontConfirmOverwrite, !enabled);
 +}
 +
 +bool QFileDialog::confirmOverwrite() const
 +{
 +    return !testOption(DontConfirmOverwrite);
 +}
 +
 +/*!
 +    \property QFileDialog::defaultSuffix
 +    \brief suffix added to the filename if no other suffix was specified
 +
 +    This property specifies a string that will be added to the
 +    filename if it has no suffix already. The suffix is typically
 +    used to indicate the file type (e.g. "txt" indicates a text
 +    file).
 +*/
 +void QFileDialog::setDefaultSuffix(const QString &suffix)
 +{
 +    Q_D(QFileDialog);
 +    d->defaultSuffix = suffix;
 +}
 +
 +QString QFileDialog::defaultSuffix() const
 +{
 +    Q_D(const QFileDialog);
 +    return d->defaultSuffix;
 +}
 +
 +/*!
 +    Sets the browsing history of the filedialog to contain the given
 +    \a paths.
 +*/
 +void QFileDialog::setHistory(const QStringList &paths)
 +{
 +    Q_D(QFileDialog);
 +    d->qFileDialogUi->lookInCombo->setHistory(paths);
 +}
 +
 +void QFileDialogComboBox::setHistory(const QStringList &paths)
 +{
 +    m_history = paths;
 +    // Only populate the first item, showPopup will populate the rest if needed
 +    QList<QUrl> list;
 +    QModelIndex idx = d_ptr->model->index(d_ptr->rootPath());
 +    //On windows the popup display the "C:\", convert to nativeSeparators
 +    QUrl url = QUrl::fromLocalFile(QDir::toNativeSeparators(idx.data(QFileSystemModel::FilePathRole).toString()));
 +    if (url.isValid())
 +        list.append(url);
 +    urlModel->setUrls(list);
 +}
 +
 +/*!
 +    Returns the browsing history of the filedialog as a list of paths.
 +*/
 +QStringList QFileDialog::history() const
 +{
 +    Q_D(const QFileDialog);
 +    QStringList currentHistory = d->qFileDialogUi->lookInCombo->history();
 +    //On windows the popup display the "C:\", convert to nativeSeparators
 +    QString newHistory = QDir::toNativeSeparators(d->rootIndex().data(QFileSystemModel::FilePathRole).toString());
 +    if (!currentHistory.contains(newHistory))
 +        currentHistory << newHistory;
 +    return currentHistory;
 +}
 +
 +/*!
 +    Sets the item delegate used to render items in the views in the
 +    file dialog to the given \a delegate.
 +
 +    \warning You should not share the same instance of a delegate between views.
 +    Doing so can cause incorrect or unintuitive editing behavior since each
 +    view connected to a given delegate may receive the \l{QAbstractItemDelegate::}{closeEditor()}
 +    signal, and attempt to access, modify or close an editor that has already been closed.
 +
 +    Note that the model used is QFileSystemModel. It has custom item data roles, which is
 +    described by the \l{QFileSystemModel::}{Roles} enum. You can use a QFileIconProvider if
 +    you only want custom icons.
 +
 +    \sa itemDelegate(), setIconProvider(), QFileSystemModel
 +*/
 +void QFileDialog::setItemDelegate(QAbstractItemDelegate *delegate)
 +{
 +    Q_D(QFileDialog);
 +    d->qFileDialogUi->listView->setItemDelegate(delegate);
 +    d->qFileDialogUi->treeView->setItemDelegate(delegate);
 +}
 +
 +/*!
 +  Returns the item delegate used to render the items in the views in the filedialog.
 +*/
 +QAbstractItemDelegate *QFileDialog::itemDelegate() const
 +{
 +    Q_D(const QFileDialog);
 +    return d->qFileDialogUi->listView->itemDelegate();
 +}
 +
 +/*!
 +    Sets the icon provider used by the filedialog to the specified \a provider.
 +*/
 +void QFileDialog::setIconProvider(QFileIconProvider *provider)
 +{
 +    Q_D(QFileDialog);
 +    d->model->setIconProvider(provider);
 +    //It forces the refresh of all entries in the side bar, then we can get new icons
 +    d->qFileDialogUi->sidebar->setUrls(d->qFileDialogUi->sidebar->urls());
 +}
 +
 +/*!
 +    Returns the icon provider used by the filedialog.
 +*/
 +QFileIconProvider *QFileDialog::iconProvider() const
 +{
 +    Q_D(const QFileDialog);
 +    return d->model->iconProvider();
 +}
 +
 +/*!
 +    Sets the \a text shown in the filedialog in the specified \a label.
 +*/
 +void QFileDialog::setLabelText(DialogLabel label, const QString &text)
 +{
 +    Q_D(QFileDialog);
 +    QPushButton *button;
 +    switch (label) {
 +    case LookIn:
 +        d->qFileDialogUi->lookInLabel->setText(text);
 +        break;
 +    case FileName:
 +        d->qFileDialogUi->fileNameLabel->setText(text);
 +        d->fileNameLabelExplicitlySat = true;
 +        break;
 +    case FileType:
 +        d->qFileDialogUi->fileTypeLabel->setText(text);
 +        break;
 +    case Accept:
 +        d->acceptLabel = text;
 +        if (acceptMode() == AcceptOpen)
 +            button = d->qFileDialogUi->buttonBox->button(QDialogButtonBox::Open);
 +        else
 +            button = d->qFileDialogUi->buttonBox->button(QDialogButtonBox::Save);
 +        if (button)
 +            button->setText(text);
 +        break;
 +    case Reject:
 +        button = d->qFileDialogUi->buttonBox->button(QDialogButtonBox::Cancel);
 +        if (button)
 +            button->setText(text);
 +        break;
 +    }
 +}
 +
 +/*!
 +    Returns the text shown in the filedialog in the specified \a label.
 +*/
 +QString QFileDialog::labelText(DialogLabel label) const
 +{
 +    QPushButton *button;
 +    Q_D(const QFileDialog);
 +    switch (label) {
 +    case LookIn:
 +        return d->qFileDialogUi->lookInLabel->text();
 +    case FileName:
 +        return d->qFileDialogUi->fileNameLabel->text();
 +    case FileType:
 +        return d->qFileDialogUi->fileTypeLabel->text();
 +    case Accept:
 +        if (acceptMode() == AcceptOpen)
 +            button = d->qFileDialogUi->buttonBox->button(QDialogButtonBox::Open);
 +        else
 +            button = d->qFileDialogUi->buttonBox->button(QDialogButtonBox::Save);
 +        if (button)
 +            return button->text();
 +    case Reject:
 +        button = d->qFileDialogUi->buttonBox->button(QDialogButtonBox::Cancel);
 +        if (button)
 +            return button->text();
 +    }
 +    return QString();
 +}
 +
 +/*
 +    For the native file dialogs
 +*/
 +
 +#if defined(Q_WS_WIN)
 +extern QString qt_win_get_open_file_name(const QFileDialogArgs &args,
 +                                         QString *initialDirectory,
 +                                         QString *selectedFilter);
 +
 +extern QString qt_win_get_save_file_name(const QFileDialogArgs &args,
 +                                         QString *initialDirectory,
 +                                         QString *selectedFilter);
 +
 +extern QStringList qt_win_get_open_file_names(const QFileDialogArgs &args,
 +                                              QString *initialDirectory,
 +                                              QString *selectedFilter);
 +
 +extern QString qt_win_get_existing_directory(const QFileDialogArgs &args);
 +#endif
 +
 +/*
 +    For Symbian file dialogs
 +*/
 +#if defined(Q_WS_S60)
 +extern QString qtSymbianGetOpenFileName(const QString &caption,
 +                                        const QString &dir,
 +                                        const QString &filter);
 +
 +extern QStringList qtSymbianGetOpenFileNames(const QString &caption,
 +                                             const QString &dir,
 +                                             const QString &filter);
 +
 +extern QString qtSymbianGetSaveFileName(const QString &caption,
 +                                        const QString &dir);
 +
 +extern QString qtSymbianGetExistingDirectory(const QString &caption,
 +                                             const QString &dir);
 +#endif
 +
 +/*!
 +    This is a convenience static function that returns an existing file
 +    selected by the user. If the user presses Cancel, it returns a null string.
 +
 +    \snippet doc/src/snippets/code/src_gui_dialogs_qfiledialog.cpp 8
 +
 +    The function creates a modal file dialog with the given \a parent widget.
 +    If \a parent is not 0, the dialog will be shown centered over the parent
 +    widget.
 +
 +    The file dialog's working directory will be set to \a dir. If \a dir
 +    includes a file name, the file will be selected. Only files that match the
 +    given \a filter are shown. The filter selected is set to \a selectedFilter.
 +    The parameters \a dir, \a selectedFilter, and \a filter may be empty
 +    strings. If you want multiple filters, separate them with ';;', for
 +    example:
 +
 +    \code
 +    "Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml)"
 +    \endcode
 +
 +    The \a options argument holds various options about how to run the dialog,
 +    see the QFileDialog::Option enum for more information on the flags you can
 +    pass.
 +
 +    The dialog's caption is set to \a caption. If \a caption is not specified
 +    then a default caption will be used.
 +
 +    On Windows, Mac OS X and Symbian^3, this static function will use the
 +    native file dialog and not a QFileDialog.
 +
 +    On Windows the dialog will spin a blocking modal event loop that will not
 +    dispatch any QTimers, and if \a parent is not 0 then it will position the
 +    dialog just below the parent's title bar.
 +
 +    On Unix/X11, the normal behavior of the file dialog is to resolve and
 +    follow symlinks. For example, if \c{/usr/tmp} is a symlink to \c{/var/tmp},
 +    the file dialog will change to \c{/var/tmp} after entering \c{/usr/tmp}. If
 +    \a options includes DontResolveSymlinks, the file dialog will treat
 +    symlinks as regular directories.
 +
 +    On Symbian^3 the parameter \a selectedFilter has no meaning and the
 +    \a options parameter is only used to define if the native file dialog is
 +    used.
 +
 +    \warning Do not delete \a parent during the execution of the dialog. If you
 +    want to do this, you should create the dialog yourself using one of the
 +    QFileDialog constructors.
 +
 +    \sa getOpenFileNames(), getSaveFileName(), getExistingDirectory()
 +*/
 +QString QFileDialog::getOpenFileName(QWidget *parent,
 +                               const QString &caption,
 +                               const QString &dir,
 +                               const QString &filter,
 +                               QString *selectedFilter,
 +                               Options options)
 +{
 +    if (qt_filedialog_open_filename_hook && !(options & DontUseNativeDialog))
 +        return qt_filedialog_open_filename_hook(parent, caption, dir, filter, selectedFilter, options);
 +#if defined(Q_WS_S60)
 +    if (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0 && !(options & DontUseNativeDialog))
 +        return qtSymbianGetOpenFileName(caption, dir, filter);
 +#endif
 +    QFileDialogArgs args;
 +    args.parent = parent;
 +    args.caption = caption;
 +    args.directory = QFileDialogPrivate::workingDirectory(dir);
 +    args.selection = QFileDialogPrivate::initialSelection(dir);
 +    args.filter = filter;
 +    args.mode = ExistingFile;
 +    args.options = options;
 +#if defined(Q_WS_WIN)
 +    if (qt_use_native_dialogs && !(args.options & DontUseNativeDialog)) {
 +        return qt_win_get_open_file_name(args, &(args.directory), selectedFilter);
 +    }
 +#endif
 +
 +    // create a qt dialog
 +    QFileDialog dialog(args);
 +    if (selectedFilter)
 +        dialog.selectNameFilter(*selectedFilter);
 +    if (dialog.exec() == QDialog::Accepted) {
 +        if (selectedFilter)
 +            *selectedFilter = dialog.selectedFilter();
 +        return dialog.selectedFiles().value(0);
 +    }
 +    return QString();
 +}
 +
 +/*!
 +    This is a convenience static function that will return one or more existing
 +    files selected by the user.
 +
 +    \snippet doc/src/snippets/code/src_gui_dialogs_qfiledialog.cpp 9
 +
 +    This function creates a modal file dialog with the given \a parent widget.
 +    If \a parent is not 0, the dialog will be shown centered over the parent
 +    widget.
 +
 +    The file dialog's working directory will be set to \a dir. If \a dir
 +    includes a file name, the file will be selected. The filter is set to
 +    \a filter so that only those files which match the filter are shown. The
 +    filter selected is set to \a selectedFilter. The parameters \a dir,
 +    \a selectedFilter and \a filter may be empty strings. If you need multiple
 +    filters, separate them with ';;', for instance:
 +
 +    \code
 +    "Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml)"
 +    \endcode
 +
 +    The dialog's caption is set to \a caption. If \a caption is not specified
 +    then a default caption will be used.
 +
 +    On Windows, Mac OS X and Symbian^3, this static function will use the
 +    native file dialog and not a QFileDialog.
 +
 +    On Windows the dialog will spin a blocking modal event loop that will not
 +    dispatch any QTimers, and if \a parent is not 0 then it will position the
 +    dialog just below the parent's title bar.
 +
 +    On Unix/X11, the normal behavior of the file dialog is to resolve and
 +    follow symlinks. For example, if \c{/usr/tmp} is a symlink to \c{/var/tmp},
 +    the file dialog will change to \c{/var/tmp} after entering \c{/usr/tmp}.
 +    The \a options argument holds various options about how to run the dialog,
 +    see the QFileDialog::Option enum for more information on the flags you can
 +    pass.
 +
 +    \note If you want to iterate over the list of files, you should iterate
 +    over a copy. For example:
 +
 +    \snippet doc/src/snippets/code/src_gui_dialogs_qfiledialog.cpp 10
 +
 +    On Symbian^3 the parameter \a selectedFilter has no meaning and the
 +    \a options parameter is only used to define if the native file dialog is
 +    used. On Symbian^3, this function can only return a single filename.
 +
 +    \warning Do not delete \a parent during the execution of the dialog. If you
 +    want to do this, you should create the dialog yourself using one of the
 +    QFileDialog constructors.
 +
 +    \sa getOpenFileName(), getSaveFileName(), getExistingDirectory()
 +*/
 +QStringList QFileDialog::getOpenFileNames(QWidget *parent,
 +                                          const QString &caption,
 +                                          const QString &dir,
 +                                          const QString &filter,
 +                                          QString *selectedFilter,
 +                                          Options options)
 +{
 +    if (qt_filedialog_open_filenames_hook && !(options & DontUseNativeDialog))
 +        return qt_filedialog_open_filenames_hook(parent, caption, dir, filter, selectedFilter, options);
 +#if defined(Q_WS_S60)
 +    if (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0 && !(options & DontUseNativeDialog))
 +        return qtSymbianGetOpenFileNames(caption, dir, filter);
 +#endif
 +    QFileDialogArgs args;
 +    args.parent = parent;
 +    args.caption = caption;
 +    args.directory = QFileDialogPrivate::workingDirectory(dir);
 +    args.selection = QFileDialogPrivate::initialSelection(dir);
 +    args.filter = filter;
 +    args.mode = ExistingFiles;
 +    args.options = options;
 +
 +#if defined(Q_WS_WIN)
 +    if (qt_use_native_dialogs && !(args.options & DontUseNativeDialog)) {
 +        return qt_win_get_open_file_names(args, &(args.directory), selectedFilter);
 +    }
 +#endif
 +
 +    // create a qt dialog
 +    QFileDialog dialog(args);
 +    if (selectedFilter)
 +        dialog.selectNameFilter(*selectedFilter);
 +    if (dialog.exec() == QDialog::Accepted) {
 +        if (selectedFilter)
 +            *selectedFilter = dialog.selectedFilter();
 +        return dialog.selectedFiles();
 +    }
 +    return QStringList();
 +}
 +
 +/*!
 +    This is a convenience static function that will return a file name selected
 +    by the user. The file does not have to exist.
 +
 +    It creates a modal file dialog with the given \a parent widget. If
 +    \a parent is not 0, the dialog will be shown centered over the parent
 +    widget.
 +
 +    \snippet doc/src/snippets/code/src_gui_dialogs_qfiledialog.cpp 11
 +
 +    The file dialog's working directory will be set to \a dir. If \a dir
 +    includes a file name, the file will be selected. Only files that match the
 +    \a filter are shown. The filter selected is set to \a selectedFilter. The
 +    parameters \a dir, \a selectedFilter, and \a filter may be empty strings.
 +    Multiple filters are separated with ';;'. For instance:
 +
 +    \code
 +    "Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml)"
 +    \endcode
 +
 +    The \a options argument holds various options about how to run the dialog,
 +    see the QFileDialog::Option enum for more information on the flags you can
 +    pass.
 +
 +    The default filter can be chosen by setting \a selectedFilter to the
 +    desired value.
 +
 +    The dialog's caption is set to \a caption. If \a caption is not specified,
 +    a default caption will be used.
 +
 +    On Windows, Mac OS X and Symbian^3, this static function will use the
 +    native file dialog and not a QFileDialog.
 +
 +    On Windows the dialog will spin a blocking modal event loop that will not
 +    dispatch any QTimers, and if \a parent is not 0 then it will position the
 +    dialog just below the parent's title bar. On Mac OS X, with its native file
 +    dialog, the filter argument is ignored.
 +
 +    On Unix/X11, the normal behavior of the file dialog is to resolve and
 +    follow symlinks. For example, if \c{/usr/tmp} is a symlink to \c{/var/tmp},
 +    the file dialog will change to \c{/var/tmp} after entering \c{/usr/tmp}. If
 +    \a options includes DontResolveSymlinks the file dialog will treat symlinks
 +    as regular directories.
 +
 +    On Symbian^3 the parameters \a filter and \a selectedFilter have no
 +    meaning. The \a options parameter is only used to define if the native file
 +    dialog is used.
 +
 +    \warning Do not delete \a parent during the execution of the dialog. If you
 +    want to do this, you should create the dialog yourself using one of the
 +    QFileDialog constructors.
 +
 +    \sa getOpenFileName(), getOpenFileNames(), getExistingDirectory()
 +*/
 +QString QFileDialog::getSaveFileName(QWidget *parent,
 +                                     const QString &caption,
 +                                     const QString &dir,
 +                                     const QString &filter,
 +                                     QString *selectedFilter,
 +                                     Options options)
 +{
 +    if (qt_filedialog_save_filename_hook && !(options & DontUseNativeDialog))
 +        return qt_filedialog_save_filename_hook(parent, caption, dir, filter, selectedFilter, options);
 +#if defined(Q_WS_S60)
 +    if (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0 && !(options & DontUseNativeDialog))
 +        return qtSymbianGetSaveFileName(caption, dir);
 +#endif
 +    QFileDialogArgs args;
 +    args.parent = parent;
 +    args.caption = caption;
 +    args.directory = QFileDialogPrivate::workingDirectory(dir);
 +    args.selection = QFileDialogPrivate::initialSelection(dir);
 +    args.filter = filter;
 +    args.mode = AnyFile;
 +    args.options = options;
 +
 +#if defined(Q_WS_WIN)
 +    if (qt_use_native_dialogs && !(args.options & DontUseNativeDialog)) {
 +        return qt_win_get_save_file_name(args, &(args.directory), selectedFilter);
 +    }
 +#endif
 +
 +    // create a qt dialog
 +    QFileDialog dialog(args);
 +    dialog.setAcceptMode(AcceptSave);
 +    if (selectedFilter)
 +        dialog.selectNameFilter(*selectedFilter);
 +    if (dialog.exec() == QDialog::Accepted) {
 +        if (selectedFilter)
 +            *selectedFilter = dialog.selectedFilter();
 +        return dialog.selectedFiles().value(0);
 +    }
 +
 +    return QString();
 +}
 +
 +/*!
 +    This is a convenience static function that will return an existing
 +    directory selected by the user.
 +
 +    \snippet doc/src/snippets/code/src_gui_dialogs_qfiledialog.cpp 12
 +
 +    This function creates a modal file dialog with the given \a parent widget.
 +    If \a parent is not 0, the dialog will be shown centered over the parent
 +    widget.
 +
 +    The dialog's working directory is set to \a dir, and the caption is set to
 +    \a caption. Either of these may be an empty string in which case the
 +    current directory and a default caption will be used respectively.
 +
 +    The \a options argument holds various options about how to run the dialog,
 +    see the QFileDialog::Option enum for more information on the flags you can
 +    pass. To ensure a native file dialog, \l{QFileDialog::}{ShowDirsOnly} must
 +    be set.
 +
 +    On Windows, Mac OS X and Symbian^3, this static function will use the
 +    native file dialog and not a QFileDialog. On Windows CE, if the device has
 +    no native file dialog, a QFileDialog will be used.
 +
 +    On Unix/X11, the normal behavior of the file dialog is to resolve and
 +    follow symlinks. For example, if \c{/usr/tmp} is a symlink to \c{/var/tmp},
 +    the file dialog will change to \c{/var/tmp} after entering \c{/usr/tmp}. If
 +    \a options includes DontResolveSymlinks, the file dialog will treat
 +    symlinks as regular directories.
 +
 +    On Windows the dialog will spin a blocking modal event loop that will not
 +    dispatch any QTimers, and if \a parent is not 0 then it will position the
 +    dialog just below the parent's title bar.
 +
 +    On Symbian^3 the \a options parameter is only used to define if the native
 +    file dialog is used.
 +
 +    \warning Do not delete \a parent during the execution of the dialog. If you
 +    want to do this, you should create the dialog yourself using one of the
 +    QFileDialog constructors.
 +
 +    \sa getOpenFileName(), getOpenFileNames(), getSaveFileName()
 +*/
 +QString QFileDialog::getExistingDirectory(QWidget *parent,
 +                                          const QString &caption,
 +                                          const QString &dir,
 +                                          Options options)
 +{
 +    if (qt_filedialog_existing_directory_hook && !(options & DontUseNativeDialog))
 +        return qt_filedialog_existing_directory_hook(parent, caption, dir, options);
 +#if defined(Q_WS_S60)
 +    if (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0 && !(options & DontUseNativeDialog))
 +        return qtSymbianGetExistingDirectory(caption, dir);
 +#endif
 +    QFileDialogArgs args;
 +    args.parent = parent;
 +    args.caption = caption;
 +    args.directory = QFileDialogPrivate::workingDirectory(dir);
 +    args.mode = (options & ShowDirsOnly ? DirectoryOnly : Directory);
 +    args.options = options;
 +
 +#if defined(Q_WS_WIN)
 +    if (qt_use_native_dialogs && !(args.options & DontUseNativeDialog) && (options & ShowDirsOnly)
 +#if defined(Q_WS_WINCE)
 +        && qt_priv_ptr_valid
 +#endif
 +        ) {
 +        return qt_win_get_existing_directory(args);
 +    }
 +#endif
 +
 +    // create a qt dialog
 +    QFileDialog dialog(args);
 +    if (dialog.exec() == QDialog::Accepted) {
 +        return dialog.selectedFiles().value(0);
 +    }
 +    return QString();
 +}
 +
 +inline static QString _qt_get_directory(const QString &path)
 +{
 +    QFileInfo info = QFileInfo(QDir::current(), path);
 +    if (info.exists() && info.isDir())
 +        return QDir::cleanPath(info.absoluteFilePath());
 +    info.setFile(info.absolutePath());
 +    if (info.exists() && info.isDir())
 +        return info.absoluteFilePath();
 +    return QString();
 +}
 +/*
 +    Get the initial directory path
 +
 +    \sa initialSelection()
 + */
 +QString QFileDialogPrivate::workingDirectory(const QString &path)
 +{
 +    if (!path.isEmpty()) {
 +        QString directory = _qt_get_directory(path);
 +        if (!directory.isEmpty())
 +            return directory;
 +    }
 +    QString directory = _qt_get_directory(*lastVisitedDir());
 +    if (!directory.isEmpty())
 +        return directory;
 +    return QDir::currentPath();
 +}
 +
 +/*
 +    Get the initial selection given a path.  The initial directory
 +    can contain both the initial directory and initial selection
 +    /home/user/foo.txt
 +
 +    \sa workingDirectory()
 + */
 +QString QFileDialogPrivate::initialSelection(const QString &path)
 +{
 +    if (!path.isEmpty()) {
 +        QFileInfo info(path);
 +        if (!info.isDir())
 +            return info.fileName();
 +    }
 +    return QString();
 +}
 +
 +/*!
 + \reimp
 +*/
 +void QFileDialog::done(int result)
 +{
 +    Q_D(QFileDialog);
 +
 +    QDialog::done(result);
 +
 +    if (d->receiverToDisconnectOnClose) {
 +        disconnect(this, d->signalToDisconnectOnClose,
 +                   d->receiverToDisconnectOnClose, d->memberToDisconnectOnClose);
 +        d->receiverToDisconnectOnClose = 0;
 +    }
 +    d->memberToDisconnectOnClose.clear();
 +    d->signalToDisconnectOnClose.clear();
 +}
 +
 +/*!
 + \reimp
 +*/
 +void QFileDialog::accept()
 +{
 +    Q_D(QFileDialog);
 +    QStringList files = selectedFiles();
 +    if (files.isEmpty())
 +        return;
 +    if (d->nativeDialogInUse){
 +        d->emitFilesSelected(files);
 +        QDialog::accept();
 +        return;
 +    }
 +
 +    QString lineEditText = d->lineEdit()->text();
 +    // "hidden feature" type .. and then enter, and it will move up a dir
 +    // special case for ".."
 +    if (lineEditText == QLatin1String("..")) {
 +        d->_q_navigateToParent();
 +        bool block = d->qFileDialogUi->fileNameEdit->blockSignals(true);
 +        d->lineEdit()->selectAll();
 +        d->qFileDialogUi->fileNameEdit->blockSignals(block);
 +        return;
 +    }
 +
 +    switch (d->fileMode) {
 +    case DirectoryOnly:
 +    case Directory: {
 +        QString fn = files.first();
 +        QFileInfo info(fn);
 +        if (!info.exists())
 +            info = QFileInfo(d->getEnvironmentVariable(fn));
 +        if (!info.exists()) {
 +#ifndef QT_NO_MESSAGEBOX
 +            QString message = tr("%1\nDirectory not found.\nPlease verify the "
 +                                          "correct directory name was given.");
 +            QMessageBox::warning(this, windowTitle(), message.arg(info.fileName()));
 +#endif // QT_NO_MESSAGEBOX
 +            return;
 +        }
 +        if (info.isDir()) {
 +            d->emitFilesSelected(files);
 +            QDialog::accept();
 +        }
 +        return;
 +    }
 +
 +    case AnyFile: {
 +        QString fn = files.first();
 +        QFileInfo info(fn);
 +        if (info.isDir()) {
 +            setDirectory(info.absoluteFilePath());
 +            return;
 +        }
 +
 +        if (!info.exists()) {
 +            int maxNameLength = d->maxNameLength(info.path());
 +            if (maxNameLength >= 0 && info.fileName().length() > maxNameLength)
 +                return;
 +        }
 +
 +        // check if we have to ask for permission to overwrite the file
 +        if (!info.exists() || !confirmOverwrite() || acceptMode() == AcceptOpen) {
 +            d->emitFilesSelected(QStringList(fn));
 +            QDialog::accept();
 +#ifndef QT_NO_MESSAGEBOX
 +        } else {
 +            if (QMessageBox::warning(this, windowTitle(),
 +                                     tr("%1 already exists.\nDo you want to replace it?")
 +                                     .arg(info.fileName()),
 +                                     QMessageBox::Yes | QMessageBox::No, QMessageBox::No)
 +                    == QMessageBox::Yes) {
 +                d->emitFilesSelected(QStringList(fn));
 +                QDialog::accept();
 +            }
 +#endif
 +        }
 +        return;
 +    }
 +
 +    case ExistingFile:
 +    case ExistingFiles:
 +        for (int i = 0; i < files.count(); ++i) {
 +            QFileInfo info(files.at(i));
 +            if (!info.exists())
 +                info = QFileInfo(d->getEnvironmentVariable(files.at(i)));
 +            if (!info.exists()) {
 +#ifndef QT_NO_MESSAGEBOX
 +                QString message = tr("%1\nFile not found.\nPlease verify the "
 +                                     "correct file name was given.");
 +                QMessageBox::warning(this, windowTitle(), message.arg(info.fileName()));
 +#endif // QT_NO_MESSAGEBOX
 +                return;
 +            }
 +            if (info.isDir()) {
 +                setDirectory(info.absoluteFilePath());
 +                d->lineEdit()->clear();
 +                return;
 +            }
 +        }
 +        d->emitFilesSelected(files);
 +        QDialog::accept();
 +        return;
 +    }
 +}
 +
 +/*!
 +    \internal
 +
 +    Create widgets, layout and set default values
 +*/
 +void QFileDialogPrivate::init(const QString &directory, const QString &nameFilter,
 +                              const QString &caption)
 +{
 +    Q_Q(QFileDialog);
 +    if (!caption.isEmpty()) {
 +        useDefaultCaption = false;
 +        setWindowTitle = caption;
 +        q->setWindowTitle(caption);
 +    }
 +
 +    createWidgets();
 +    createMenuActions();
 +    retranslateStrings();
 +    q->setFileMode(fileMode);
 +
 +#ifndef QT_NO_SETTINGS
 +    QSettings settings(QSettings::UserScope, QLatin1String("Trolltech"));
 +    settings.beginGroup(QLatin1String("Qt"));
 +    if (!directory.isEmpty())
 +        setLastVisitedDirectory(workingDirectory(directory));
 +    q->restoreState(settings.value(QLatin1String("filedialog")).toByteArray());
 +#endif
 +
 +#if defined(Q_EMBEDDED_SMALLSCREEN)
 +    qFileDialogUi->lookInLabel->setVisible(false);
 +    qFileDialogUi->fileNameLabel->setVisible(false);
 +    qFileDialogUi->fileTypeLabel->setVisible(false);
 +    qFileDialogUi->sidebar->hide();
 +#endif
 +    // Default case
 +    if (!nameFilter.isEmpty())
 +        q->setNameFilter(nameFilter);
 +    q->setAcceptMode(QFileDialog::AcceptOpen);
 +    q->setDirectory(workingDirectory(directory));
 +    q->selectFile(initialSelection(directory));
 +
 +    _q_updateOkButton();
 +    q->resize(q->sizeHint());
 +}
 +
 +/*!
 +    \internal
 +
 +    Create the widgets, set properties and connections
 +*/
 +void QFileDialogPrivate::createWidgets()
 +{
 +    Q_Q(QFileDialog);
 +    model = new QFileSystemModel(q);
 +    model->setObjectName(QLatin1String("qt_filesystem_model"));
 +#ifdef Q_WS_MAC
 +    model->setNameFilterDisables(true);
 +#else
 +    model->setNameFilterDisables(false);
 +#endif
 +    model->d_func()->disableRecursiveSort = true;
 +    QFileDialog::connect(model, SIGNAL(fileRenamed(QString,QString,QString)), q, SLOT(_q_fileRenamed(QString,QString,QString)));
 +    QFileDialog::connect(model, SIGNAL(rootPathChanged(QString)),
 +            q, SLOT(_q_pathChanged(QString)));
 +    QFileDialog::connect(model, SIGNAL(rowsInserted(QModelIndex,int,int)),
 +            q, SLOT(_q_rowsInserted(QModelIndex)));
 +    model->setReadOnly(false);
 +
 +    qFileDialogUi.reset(new Ui_QFileDialog());
 +    qFileDialogUi->setupUi(q);
 +
 +    QList<QUrl> initialBookmarks;
 +    initialBookmarks << QUrl::fromLocalFile(QLatin1String(""))
 +                     << QUrl::fromLocalFile(QDir::homePath());
 +    qFileDialogUi->sidebar->init(model, initialBookmarks);
 +    QFileDialog::connect(qFileDialogUi->sidebar, SIGNAL(goToUrl(QUrl)),
 +                         q, SLOT(_q_goToUrl(QUrl)));
 +
 +    QObject::connect(qFileDialogUi->buttonBox, SIGNAL(accepted()), q, SLOT(accept()));
 +    QObject::connect(qFileDialogUi->buttonBox, SIGNAL(rejected()), q, SLOT(reject()));
 +
 +
 +    qFileDialogUi->lookInCombo->init(this);
 +    QObject::connect(qFileDialogUi->lookInCombo, SIGNAL(activated(QString)), q, SLOT(_q_goToDirectory(QString)));
 +
 +    qFileDialogUi->lookInCombo->setInsertPolicy(QComboBox::NoInsert);
 +    qFileDialogUi->lookInCombo->setDuplicatesEnabled(false);
 +
 +    // filename
 +    qFileDialogUi->fileNameEdit->init(this);
 +#ifndef QT_NO_SHORTCUT
 +    qFileDialogUi->fileNameLabel->setBuddy(qFileDialogUi->fileNameEdit);
 +#endif
 +#ifndef QT_NO_FSCOMPLETER
 +    completer = new QFSCompleter(model, q);
 +    qFileDialogUi->fileNameEdit->setCompleter(completer);
 +#endif // QT_NO_FSCOMPLETER
 +    QObject::connect(qFileDialogUi->fileNameEdit, SIGNAL(textChanged(QString)),
 +            q, SLOT(_q_autoCompleteFileName(QString)));
 +    QObject::connect(qFileDialogUi->fileNameEdit, SIGNAL(textChanged(QString)),
 +                     q, SLOT(_q_updateOkButton()));
 +
 +    QObject::connect(qFileDialogUi->fileNameEdit, SIGNAL(returnPressed()), q, SLOT(accept()));
 +
 +    // filetype
 +    qFileDialogUi->fileTypeCombo->setDuplicatesEnabled(false);
 +    qFileDialogUi->fileTypeCombo->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLength);
 +    qFileDialogUi->fileTypeCombo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
 +    QObject::connect(qFileDialogUi->fileTypeCombo, SIGNAL(activated(int)),
 +                     q, SLOT(_q_useNameFilter(int)));
 +    QObject::connect(qFileDialogUi->fileTypeCombo, SIGNAL(activated(QString)),
 +                     q, SIGNAL(filterSelected(QString)));
 +
 +    qFileDialogUi->listView->init(this);
 +    qFileDialogUi->listView->setModel(model);
 +    QObject::connect(qFileDialogUi->listView, SIGNAL(activated(QModelIndex)),
 +                     q, SLOT(_q_enterDirectory(QModelIndex)));
 +    QObject::connect(qFileDialogUi->listView, SIGNAL(customContextMenuRequested(QPoint)),
 +                    q, SLOT(_q_showContextMenu(QPoint)));
 +#ifndef QT_NO_SHORTCUT
 +    QShortcut *shortcut = new QShortcut(qFileDialogUi->listView);
 +    shortcut->setKey(QKeySequence(QLatin1String("Delete")));
 +    QObject::connect(shortcut, SIGNAL(activated()), q, SLOT(_q_deleteCurrent()));
 +#endif
 +
 +    qFileDialogUi->treeView->init(this);
 +    qFileDialogUi->treeView->setModel(model);
 +    QHeaderView *treeHeader = qFileDialogUi->treeView->header();
 +    QFontMetrics fm(q->font());
 +    treeHeader->resizeSection(0, fm.width(QLatin1String("wwwwwwwwwwwwwwwwwwwwwwwwww")));
 +    treeHeader->resizeSection(1, fm.width(QLatin1String("128.88 GB")));
 +    treeHeader->resizeSection(2, fm.width(QLatin1String("mp3Folder")));
 +    treeHeader->resizeSection(3, fm.width(QLatin1String("10/29/81 02:02PM")));
 +    treeHeader->setContextMenuPolicy(Qt::ActionsContextMenu);
 +
 +    QActionGroup *showActionGroup = new QActionGroup(q);
 +    showActionGroup->setExclusive(false);
 +    QObject::connect(showActionGroup, SIGNAL(triggered(QAction*)),
 +                     q, SLOT(_q_showHeader(QAction*)));;
 +
 +    QAbstractItemModel *abstractModel = model;
 +#ifndef QT_NO_PROXYMODEL
 +    if (proxyModel)
 +        abstractModel = proxyModel;
 +#endif
 +    for (int i = 1; i < abstractModel->columnCount(QModelIndex()); ++i) {
 +        QAction *showHeader = new QAction(showActionGroup);
 +        showHeader->setCheckable(true);
 +        showHeader->setChecked(true);
 +        treeHeader->addAction(showHeader);
 +    }
 +
 +    QScopedPointer<QItemSelectionModel> selModel(qFileDialogUi->treeView->selectionModel());
 +    qFileDialogUi->treeView->setSelectionModel(qFileDialogUi->listView->selectionModel());
 +
 +    QObject::connect(qFileDialogUi->treeView, SIGNAL(activated(QModelIndex)),
 +                     q, SLOT(_q_enterDirectory(QModelIndex)));
 +    QObject::connect(qFileDialogUi->treeView, SIGNAL(customContextMenuRequested(QPoint)),
 +                     q, SLOT(_q_showContextMenu(QPoint)));
 +#ifndef QT_NO_SHORTCUT
 +    shortcut = new QShortcut(qFileDialogUi->treeView);
 +    shortcut->setKey(QKeySequence(QLatin1String("Delete")));
 +    QObject::connect(shortcut, SIGNAL(activated()), q, SLOT(_q_deleteCurrent()));
 +#endif
 +
 +    // Selections
 +    QItemSelectionModel *selections = qFileDialogUi->listView->selectionModel();
 +    QObject::connect(selections, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
 +                     q, SLOT(_q_selectionChanged()));
 +    QObject::connect(selections, SIGNAL(currentChanged(QModelIndex,QModelIndex)),
 +                     q, SLOT(_q_currentChanged(QModelIndex)));
 +    qFileDialogUi->splitter->setStretchFactor(qFileDialogUi->splitter->indexOf(qFileDialogUi->splitter->widget(1)), QSizePolicy::Expanding);
 +
 +    createToolButtons();
 +}
 +
 +void QFileDialogPrivate::_q_showHeader(QAction *action)
 +{
 +    Q_Q(QFileDialog);
 +    QActionGroup *actionGroup = qobject_cast<QActionGroup*>(q->sender());
 +    qFileDialogUi->treeView->header()->setSectionHidden(actionGroup->actions().indexOf(action) + 1, !action->isChecked());
 +}
 +
 +#ifndef QT_NO_PROXYMODEL
 +/*!
 +    \since 4.3
 +
 +    Sets the model for the views to the given \a proxyModel.  This is useful if you
 +    want to modify the underlying model; for example, to add columns, filter
 +    data or add drives.
 +
 +    Any existing proxy model will be removed, but not deleted.  The file dialog
 +    will take ownership of the \a proxyModel.
 +
 +    \sa proxyModel()
 +*/
 +void QFileDialog::setProxyModel(QAbstractProxyModel *proxyModel)
 +{
 +    Q_D(QFileDialog);
 +    if ((!proxyModel && !d->proxyModel)
 +        || (proxyModel == d->proxyModel))
 +        return;
 +
 +    QModelIndex idx = d->rootIndex();
 +    if (d->proxyModel) {
 +        disconnect(d->proxyModel, SIGNAL(rowsInserted(QModelIndex,int,int)),
 +            this, SLOT(_q_rowsInserted(QModelIndex)));
 +    } else {
 +        disconnect(d->model, SIGNAL(rowsInserted(QModelIndex,int,int)),
 +            this, SLOT(_q_rowsInserted(QModelIndex)));
 +    }
 +
 +    if (proxyModel != 0) {
 +        proxyModel->setParent(this);
 +        d->proxyModel = proxyModel;
 +        proxyModel->setSourceModel(d->model);
 +        d->qFileDialogUi->listView->setModel(d->proxyModel);
 +        d->qFileDialogUi->treeView->setModel(d->proxyModel);
 +#ifndef QT_NO_FSCOMPLETER
 +        d->completer->setModel(d->proxyModel);
 +        d->completer->proxyModel = d->proxyModel;
 +#endif
 +        connect(d->proxyModel, SIGNAL(rowsInserted(QModelIndex,int,int)),
 +            this, SLOT(_q_rowsInserted(QModelIndex)));
 +    } else {
 +        d->proxyModel = 0;
 +        d->qFileDialogUi->listView->setModel(d->model);
 +        d->qFileDialogUi->treeView->setModel(d->model);
 +#ifndef QT_NO_FSCOMPLETER
 +        d->completer->setModel(d->model);
 +        d->completer->sourceModel = d->model;
 +        d->completer->proxyModel = 0;
 +#endif
 +        connect(d->model, SIGNAL(rowsInserted(QModelIndex,int,int)),
 +            this, SLOT(_q_rowsInserted(QModelIndex)));
 +    }
 +    QScopedPointer<QItemSelectionModel> selModel(d->qFileDialogUi->treeView->selectionModel());
 +    d->qFileDialogUi->treeView->setSelectionModel(d->qFileDialogUi->listView->selectionModel());
 +
 +    d->setRootIndex(idx);
 +
 +    // reconnect selection
 +    QItemSelectionModel *selections = d->qFileDialogUi->listView->selectionModel();
 +    QObject::connect(selections, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
 +                     this, SLOT(_q_selectionChanged()));
 +    QObject::connect(selections, SIGNAL(currentChanged(QModelIndex,QModelIndex)),
 +                     this, SLOT(_q_currentChanged(QModelIndex)));
 +}
 +
 +/*!
 +    Returns the proxy model used by the file dialog.  By default no proxy is set.
 +
 +    \sa setProxyModel()
 +*/
 +QAbstractProxyModel *QFileDialog::proxyModel() const
 +{
 +    Q_D(const QFileDialog);
 +    return d->proxyModel;
 +}
 +#endif // QT_NO_PROXYMODEL
 +
 +/*!
 +    \internal
 +
 +    Create tool buttons, set properties and connections
 +*/
 +void QFileDialogPrivate::createToolButtons()
 +{
 +    Q_Q(QFileDialog);
 +    qFileDialogUi->backButton->setIcon(q->style()->standardIcon(QStyle::SP_ArrowBack, 0, q));
 +    qFileDialogUi->backButton->setAutoRaise(true);
 +    qFileDialogUi->backButton->setEnabled(false);
 +    QObject::connect(qFileDialogUi->backButton, SIGNAL(clicked()), q, SLOT(_q_navigateBackward()));
 +
 +    qFileDialogUi->forwardButton->setIcon(q->style()->standardIcon(QStyle::SP_ArrowForward, 0, q));
 +    qFileDialogUi->forwardButton->setAutoRaise(true);
 +    qFileDialogUi->forwardButton->setEnabled(false);
 +    QObject::connect(qFileDialogUi->forwardButton, SIGNAL(clicked()), q, SLOT(_q_navigateForward()));
 +
 +    qFileDialogUi->toParentButton->setIcon(q->style()->standardIcon(QStyle::SP_FileDialogToParent, 0, q));
 +    qFileDialogUi->toParentButton->setAutoRaise(true);
 +    qFileDialogUi->toParentButton->setEnabled(false);
 +    QObject::connect(qFileDialogUi->toParentButton, SIGNAL(clicked()), q, SLOT(_q_navigateToParent()));
 +
 +    qFileDialogUi->listModeButton->setIcon(q->style()->standardIcon(QStyle::SP_FileDialogListView, 0, q));
 +    qFileDialogUi->listModeButton->setAutoRaise(true);
 +    qFileDialogUi->listModeButton->setDown(true);
 +    QObject::connect(qFileDialogUi->listModeButton, SIGNAL(clicked()), q, SLOT(_q_showListView()));
 +
 +    qFileDialogUi->detailModeButton->setIcon(q->style()->standardIcon(QStyle::SP_FileDialogDetailedView, 0, q));
 +    qFileDialogUi->detailModeButton->setAutoRaise(true);
 +    QObject::connect(qFileDialogUi->detailModeButton, SIGNAL(clicked()), q, SLOT(_q_showDetailsView()));
 +
 +    QSize toolSize(qFileDialogUi->fileNameEdit->sizeHint().height(), qFileDialogUi->fileNameEdit->sizeHint().height());
 +    qFileDialogUi->backButton->setFixedSize(toolSize);
 +    qFileDialogUi->listModeButton->setFixedSize(toolSize);
 +    qFileDialogUi->detailModeButton->setFixedSize(toolSize);
 +    qFileDialogUi->forwardButton->setFixedSize(toolSize);
 +    qFileDialogUi->toParentButton->setFixedSize(toolSize);
 +
 +    qFileDialogUi->newFolderButton->setIcon(q->style()->standardIcon(QStyle::SP_FileDialogNewFolder, 0, q));
 +    qFileDialogUi->newFolderButton->setFixedSize(toolSize);
 +    qFileDialogUi->newFolderButton->setAutoRaise(true);
 +    qFileDialogUi->newFolderButton->setEnabled(false);
 +    QObject::connect(qFileDialogUi->newFolderButton, SIGNAL(clicked()), q, SLOT(_q_createDirectory()));
 +}
 +
 +/*!
 +    \internal
 +
 +    Create actions which will be used in the right click.
 +*/
 +void QFileDialogPrivate::createMenuActions()
 +{
 +    Q_Q(QFileDialog);
 +
 +    QAction *goHomeAction =  new QAction(q);
 +#ifndef QT_NO_SHORTCUT
 +    goHomeAction->setShortcut(Qt::CTRL + Qt::Key_H + Qt::SHIFT);
 +#endif
 +    QObject::connect(goHomeAction, SIGNAL(triggered()), q, SLOT(_q_goHome()));
 +    q->addAction(goHomeAction);
 +
 +    // ### TODO add Desktop & Computer actions
 +
 +    QAction *goToParent =  new QAction(q);
 +    goToParent->setObjectName(QLatin1String("qt_goto_parent_action"));
 +#ifndef QT_NO_SHORTCUT
 +    goToParent->setShortcut(Qt::CTRL + Qt::UpArrow);
 +#endif
 +    QObject::connect(goToParent, SIGNAL(triggered()), q, SLOT(_q_navigateToParent()));
 +    q->addAction(goToParent);
 +
 +    renameAction = new QAction(q);
 +    renameAction->setEnabled(false);
 +    renameAction->setObjectName(QLatin1String("qt_rename_action"));
 +    QObject::connect(renameAction, SIGNAL(triggered()), q, SLOT(_q_renameCurrent()));
 +
 +    deleteAction = new QAction(q);
 +    deleteAction->setEnabled(false);
 +    deleteAction->setObjectName(QLatin1String("qt_delete_action"));
 +    QObject::connect(deleteAction, SIGNAL(triggered()), q, SLOT(_q_deleteCurrent()));
 +
 +    showHiddenAction = new QAction(q);
 +    showHiddenAction->setObjectName(QLatin1String("qt_show_hidden_action"));
 +    showHiddenAction->setCheckable(true);
 +    QObject::connect(showHiddenAction, SIGNAL(triggered()), q, SLOT(_q_showHidden()));
 +
 +    newFolderAction = new QAction(q);
 +    newFolderAction->setObjectName(QLatin1String("qt_new_folder_action"));
 +    QObject::connect(newFolderAction, SIGNAL(triggered()), q, SLOT(_q_createDirectory()));
 +}
 +
 +void QFileDialogPrivate::_q_goHome()
 +{
 +    Q_Q(QFileDialog);
 +    q->setDirectory(QDir::homePath());
 +}
 +
 +/*!
 +    \internal
 +
 +    Update history with new path, buttons, and combo
 +*/
 +void QFileDialogPrivate::_q_pathChanged(const QString &newPath)
 +{
 +    Q_Q(QFileDialog);
 +    QDir dir(model->rootDirectory());
 +    qFileDialogUi->toParentButton->setEnabled(dir.exists());
 +    qFileDialogUi->sidebar->selectUrl(QUrl::fromLocalFile(newPath));
 +    q->setHistory(qFileDialogUi->lookInCombo->history());
 +
 +    if (currentHistoryLocation < 0 || currentHistory.value(currentHistoryLocation) != QDir::toNativeSeparators(newPath)) {
 +        while (currentHistoryLocation >= 0 && currentHistoryLocation + 1 < currentHistory.count()) {
 +            currentHistory.removeLast();
 +        }
 +        currentHistory.append(QDir::toNativeSeparators(newPath));
 +        ++currentHistoryLocation;
 +    }
 +    qFileDialogUi->forwardButton->setEnabled(currentHistory.size() - currentHistoryLocation > 1);
 +    qFileDialogUi->backButton->setEnabled(currentHistoryLocation > 0);
 +}
 +
 +/*!
 +    \internal
 +
 +    Navigates to the last directory viewed in the dialog.
 +*/
 +void QFileDialogPrivate::_q_navigateBackward()
 +{
 +    Q_Q(QFileDialog);
 +    if (!currentHistory.isEmpty() && currentHistoryLocation > 0) {
 +        --currentHistoryLocation;
 +        QString previousHistory = currentHistory.at(currentHistoryLocation);
 +        q->setDirectory(previousHistory);
 +    }
 +}
 +
 +/*!
 +    \internal
 +
 +    Navigates to the last directory viewed in the dialog.
 +*/
 +void QFileDialogPrivate::_q_navigateForward()
 +{
 +    Q_Q(QFileDialog);
 +    if (!currentHistory.isEmpty() && currentHistoryLocation < currentHistory.size() - 1) {
 +        ++currentHistoryLocation;
 +        QString nextHistory = currentHistory.at(currentHistoryLocation);
 +        q->setDirectory(nextHistory);
 +    }
 +}
 +
 +/*!
 +    \internal
 +
 +    Navigates to the parent directory of the currently displayed directory
 +    in the dialog.
 +*/
 +void QFileDialogPrivate::_q_navigateToParent()
 +{
 +    Q_Q(QFileDialog);
 +    QDir dir(model->rootDirectory());
 +    QString newDirectory;
 +    if (dir.isRoot()) {
 +        newDirectory = model->myComputer().toString();
 +    } else {
 +        dir.cdUp();
 +        newDirectory = dir.absolutePath();
 +    }
 +    q->setDirectory(newDirectory);
 +    emit q->directoryEntered(newDirectory);
 +}
 +
 +/*!
 +    \internal
 +
 +    Creates a new directory, first asking the user for a suitable name.
 +*/
 +void QFileDialogPrivate::_q_createDirectory()
 +{
 +    Q_Q(QFileDialog);
 +    qFileDialogUi->listView->clearSelection();
 +
 +    QString newFolderString = QFileDialog::tr("New Folder");
 +    QString folderName = newFolderString;
 +    QString prefix = q->directory().absolutePath() + QDir::separator();
 +    if (QFile::exists(prefix + folderName)) {
 +        qlonglong suffix = 2;
 +        while (QFile::exists(prefix + folderName)) {
 +            folderName = newFolderString + QString::number(suffix++);
 +        }
 +    }
 +
 +    QModelIndex parent = rootIndex();
 +    QModelIndex index = model->mkdir(parent, folderName);
 +    if (!index.isValid())
 +        return;
 +
 +    index = select(index);
 +    if (index.isValid()) {
 +        qFileDialogUi->treeView->setCurrentIndex(index);
 +        currentView()->edit(index);
 +    }
 +}
 +
 +void QFileDialogPrivate::_q_showListView()
 +{
 +    qFileDialogUi->listModeButton->setDown(true);
 +    qFileDialogUi->detailModeButton->setDown(false);
 +    qFileDialogUi->treeView->hide();
 +    qFileDialogUi->listView->show();
 +    qFileDialogUi->stackedWidget->setCurrentWidget(qFileDialogUi->listView->parentWidget());
 +    qFileDialogUi->listView->doItemsLayout();
 +}
 +
 +void QFileDialogPrivate::_q_showDetailsView()
 +{
 +    qFileDialogUi->listModeButton->setDown(false);
 +    qFileDialogUi->detailModeButton->setDown(true);
 +    qFileDialogUi->listView->hide();
 +    qFileDialogUi->treeView->show();
 +    qFileDialogUi->stackedWidget->setCurrentWidget(qFileDialogUi->treeView->parentWidget());
 +    qFileDialogUi->treeView->doItemsLayout();
 +}
 +
 +/*!
 +    \internal
 +
 +    Show the context menu for the file/dir under position
 +*/
 +void QFileDialogPrivate::_q_showContextMenu(const QPoint &position)
 +{
 +#ifdef QT_NO_MENU
 +    Q_UNUSED(position);
 +#else
 +    Q_Q(QFileDialog);
 +    QAbstractItemView *view = 0;
 +    if (q->viewMode() == QFileDialog::Detail)
 +        view = qFileDialogUi->treeView;
 +    else
 +        view = qFileDialogUi->listView;
 +    QModelIndex index = view->indexAt(position);
 +    index = mapToSource(index.sibling(index.row(), 0));
 +
 +    QMenu menu(view);
 +    if (index.isValid()) {
 +        // file context menu
 +        QFile::Permissions p(index.parent().data(QFileSystemModel::FilePermissions).toInt());
 +        renameAction->setEnabled(p & QFile::WriteUser);
 +        menu.addAction(renameAction);
 +        deleteAction->setEnabled(p & QFile::WriteUser);
 +        menu.addAction(deleteAction);
 +        menu.addSeparator();
 +    }
 +    menu.addAction(showHiddenAction);
 +    if (qFileDialogUi->newFolderButton->isVisible()) {
 +        newFolderAction->setEnabled(qFileDialogUi->newFolderButton->isEnabled());
 +        menu.addAction(newFolderAction);
 +    }
 +    menu.exec(view->viewport()->mapToGlobal(position));
 +#endif // QT_NO_MENU
 +}
 +
 +/*!
 +    \internal
 +*/
 +void QFileDialogPrivate::_q_renameCurrent()
 +{
 +    Q_Q(QFileDialog);
 +    QModelIndex index = qFileDialogUi->listView->currentIndex();
 +    index = index.sibling(index.row(), 0);
 +    if (q->viewMode() == QFileDialog::List)
 +        qFileDialogUi->listView->edit(index);
 +    else
 +        qFileDialogUi->treeView->edit(index);
 +}
 +
 +bool QFileDialogPrivate::removeDirectory(const QString &path)
 +{
 +    QModelIndex modelIndex = model->index(path);
 +    return model->remove(modelIndex);
 +}
 +
 +/*!
 +    \internal
 +
 +    Deletes the currently selected item in the dialog.
 +*/
 +void QFileDialogPrivate::_q_deleteCurrent()
 +{
 +    if (model->isReadOnly())
 +        return;
 +
 +    QModelIndexList list = qFileDialogUi->listView->selectionModel()->selectedRows();
 +    for (int i = list.count() - 1; i >= 0; --i) {
 +        QModelIndex index = list.at(i);
 +        if (index == qFileDialogUi->listView->rootIndex())
 +            continue;
 +
 +        index = mapToSource(index.sibling(index.row(), 0));
 +        if (!index.isValid())
 +            continue;
 +
 +    QString fileName = index.data(QFileSystemModel::FileNameRole).toString();
 +    QString filePath = index.data(QFileSystemModel::FilePathRole).toString();
 +    bool isDir = model->isDir(index);
 +
 +    QFile::Permissions p(index.parent().data(QFileSystemModel::FilePermissions).toInt());
 +#ifndef QT_NO_MESSAGEBOX
 +    Q_Q(QFileDialog);
 +    if (!(p & QFile::WriteUser) && (QMessageBox::warning(q_func(), q_func()->windowTitle(),
 +                                QFileDialog::tr("'%1' is write protected.\nDo you want to delete it anyway?")
 +                                .arg(fileName),
 +                                 QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No))
 +        return;
 +    else if (QMessageBox::warning(q_func(), q_func()->windowTitle(),
 +                                  QFileDialog::tr("Are sure you want to delete '%1'?")
 +                                  .arg(fileName),
 +                                  QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No)
 +        return;
 +
 +#else
 +    if (!(p & QFile::WriteUser))
 +        return;
 +#endif // QT_NO_MESSAGEBOX
 +
 +        // the event loop has run, we can NOT reuse index because the model might have removed it.
 +        if (isDir) {
 +            if (!removeDirectory(filePath)) {
 +#ifndef QT_NO_MESSAGEBOX
 +            QMessageBox::warning(q, q->windowTitle(),
 +                                QFileDialog::tr("Could not delete directory."));
 +#endif
 +            }
 +        } else {
 +            model->remove(index);
 +        }
 +    }
 +}
 +
 +void QFileDialogPrivate::_q_autoCompleteFileName(const QString &text)
 +{
 +    if (text.startsWith(QLatin1String("//")) || text.startsWith(QLatin1Char('\\'))) {
 +        qFileDialogUi->listView->selectionModel()->clearSelection();
 +        return;
 +    }
 +
 +    QStringList multipleFiles = typedFiles();
 +    if (multipleFiles.count() > 0) {
 +        QModelIndexList oldFiles = qFileDialogUi->listView->selectionModel()->selectedRows();
 +        QModelIndexList newFiles;
 +        for (int i = 0; i < multipleFiles.count(); ++i) {
 +            QModelIndex idx = model->index(multipleFiles.at(i));
 +            if (oldFiles.contains(idx))
 +                oldFiles.removeAll(idx);
 +            else
 +                newFiles.append(idx);
 +        }
 +        for (int i = 0; i < newFiles.count(); ++i)
 +            select(newFiles.at(i));
 +        if (lineEdit()->hasFocus())
 +            for (int i = 0; i < oldFiles.count(); ++i)
 +                qFileDialogUi->listView->selectionModel()->select(oldFiles.at(i),
 +                    QItemSelectionModel::Toggle | QItemSelectionModel::Rows);
 +    }
 +}
 +
 +/*!
 +    \internal
 +*/
 +void QFileDialogPrivate::_q_updateOkButton()
 +{
 +    Q_Q(QFileDialog);
 +    QPushButton *button =  qFileDialogUi->buttonBox->button((acceptMode == QFileDialog::AcceptOpen)
 +                    ? QDialogButtonBox::Open : QDialogButtonBox::Save);
 +    if (!button)
 +        return;
 +
 +    bool enableButton = true;
 +    bool isOpenDirectory = false;
 +
 +    QStringList files = q->selectedFiles();
 +    QString lineEditText = lineEdit()->text();
 +
 +    if (lineEditText.startsWith(QLatin1String("//")) || lineEditText.startsWith(QLatin1Char('\\'))) {
 +        button->setEnabled(true);
 +        if (acceptMode == QFileDialog::AcceptSave)
 +            button->setText(acceptLabel);
 +        return;
 +    }
 +
 +    if (files.isEmpty()) {
 +        enableButton = false;
 +    } else if (lineEditText == QLatin1String("..")) {
 +        isOpenDirectory = true;
 +    } else {
 +        switch (fileMode) {
 +        case QFileDialog::DirectoryOnly:
 +        case QFileDialog::Directory: {
 +            QString fn = files.first();
 +            QModelIndex idx = model->index(fn);
 +            if (!idx.isValid())
 +                idx = model->index(getEnvironmentVariable(fn));
 +            if (!idx.isValid() || !model->isDir(idx))
 +                enableButton = false;
 +            break;
 +        }
 +        case QFileDialog::AnyFile: {
 +            QString fn = files.first();
 +            QFileInfo info(fn);
 +            QModelIndex idx = model->index(fn);
 +            QString fileDir;
 +            QString fileName;
 +            if (info.isDir()) {
 +                fileDir = info.canonicalFilePath();
 +            } else {
 +                fileDir = fn.mid(0, fn.lastIndexOf(QLatin1Char('/')));
 +                fileName = fn.mid(fileDir.length() + 1);
 +            }
 +            if (lineEditText.contains(QLatin1String(".."))) {
 +                fileDir = info.canonicalFilePath();
 +                fileName = info.fileName();
 +            }
 +
 +            if (fileDir == q->directory().canonicalPath() && fileName.isEmpty()) {
 +                enableButton = false;
 +                break;
 +            }
 +            if (idx.isValid() && model->isDir(idx)) {
 +                isOpenDirectory = true;
 +                enableButton = true;
 +                break;
 +            }
 +            if (!idx.isValid()) {
 +                int maxLength = maxNameLength(fileDir);
 +                enableButton = maxLength < 0 || fileName.length() <= maxLength;
 +            }
 +            break;
 +        }
 +        case QFileDialog::ExistingFile:
 +        case QFileDialog::ExistingFiles:
 +            for (int i = 0; i < files.count(); ++i) {
 +                QModelIndex idx = model->index(files.at(i));
 +                if (!idx.isValid())
 +                    idx = model->index(getEnvironmentVariable(files.at(i)));
 +                if (!idx.isValid()) {
 +                    enableButton = false;
 +                    break;
 +                }
 +                if (idx.isValid() && model->isDir(idx)) {
 +                    isOpenDirectory = true;
 +                    break;
 +                }
 +            }
 +            break;
 +        default:
 +            break;
 +        }
 +    }
 +
 +    button->setEnabled(enableButton);
 +    if (acceptMode == QFileDialog::AcceptSave)
 +        button->setText(isOpenDirectory ? QFileDialog::tr("&Open") : acceptLabel);
 +}
 +
 +/*!
 +    \internal
 +*/
 +void QFileDialogPrivate::_q_currentChanged(const QModelIndex &index)
 +{
 +    _q_updateOkButton();
 +    emit q_func()->currentChanged(index.data(QFileSystemModel::FilePathRole).toString());
 +}
 +
 +/*!
 +    \internal
 +
 +    This is called when the user double clicks on a file with the corresponding
 +    model item \a index.
 +*/
 +void QFileDialogPrivate::_q_enterDirectory(const QModelIndex &index)
 +{
 +    Q_Q(QFileDialog);
 +    // My Computer or a directory
 +    QModelIndex sourceIndex = index.model() == proxyModel ? mapToSource(index) : index;
 +    QString path = sourceIndex.data(QFileSystemModel::FilePathRole).toString();
 +    if (path.isEmpty() || model->isDir(sourceIndex)) {
 +        q->setDirectory(path);
 +        emit q->directoryEntered(path);
 +        if (fileMode == QFileDialog::Directory
 +                || fileMode == QFileDialog::DirectoryOnly) {
 +            // ### find out why you have to do both of these.
 +            lineEdit()->setText(QString());
 +            lineEdit()->clear();
 +        }
 +    } else {
 +        q->accept();
 +    }
 +}
 +
 +/*!
 +    \internal
 +
 +    Changes the file dialog's current directory to the one specified
 +    by \a path.
 +*/
 +void QFileDialogPrivate::_q_goToDirectory(const QString &path)
 +{
 + #ifndef QT_NO_MESSAGEBOX
 +    Q_Q(QFileDialog);
 +#endif
 +    QModelIndex index = qFileDialogUi->lookInCombo->model()->index(qFileDialogUi->lookInCombo->currentIndex(),
 +                                                    qFileDialogUi->lookInCombo->modelColumn(),
 +                                                    qFileDialogUi->lookInCombo->rootModelIndex());
 +    QString path2 = path;
 +    if (!index.isValid())
 +        index = mapFromSource(model->index(getEnvironmentVariable(path)));
 +    else {
 +        path2 = index.data(UrlRole).toUrl().toLocalFile();
 +        index = mapFromSource(model->index(path2));
 +    }
 +    QDir dir(path2);
 +    if (!dir.exists())
 +        dir = getEnvironmentVariable(path2);
 +
 +    if (dir.exists() || path2.isEmpty() || path2 == model->myComputer().toString()) {
 +        _q_enterDirectory(index);
 +#ifndef QT_NO_MESSAGEBOX
 +    } else {
 +        QString message = QFileDialog::tr("%1\nDirectory not found.\nPlease verify the "
 +                                          "correct directory name was given.");
 +        QMessageBox::warning(q, q->windowTitle(), message.arg(path2));
 +#endif // QT_NO_MESSAGEBOX
 +    }
 +}
 +
 +// Makes a list of filters from a normal filter string "Image Files (*.png *.jpg)"
 +QStringList qt_clean_filter_list(const QString &filter)
 +{
 +    QRegExp regexp(QString::fromLatin1(qt_file_dialog_filter_reg_exp));
 +    QString f = filter;
 +    int i = regexp.indexIn(f);
 +    if (i >= 0)
 +        f = regexp.cap(2);
 +    return f.split(QLatin1Char(' '), QString::SkipEmptyParts);
 +}
 +
 +/*!
 +    \internal
 +
 +    Sets the current name filter to be nameFilter and
 +    update the qFileDialogUi->fileNameEdit when in AcceptSave mode with the new extension.
 +*/
 +void QFileDialogPrivate::_q_useNameFilter(int index)
 +{
 +    if (index == nameFilters.size()) {
 +        QAbstractItemModel *comboModel = qFileDialogUi->fileTypeCombo->model();
 +        nameFilters.append(comboModel->index(comboModel->rowCount() - 1, 0).data().toString());
 +    }
 +
 +    QString nameFilter = nameFilters.at(index);
 +    QStringList newNameFilters = qt_clean_filter_list(nameFilter);
 +    if (acceptMode == QFileDialog::AcceptSave) {
 +        QString newNameFilterExtension;
 +        if (newNameFilters.count() > 0)
 +            newNameFilterExtension = QFileInfo(newNameFilters.at(0)).suffix();
 +
 +        QString fileName = lineEdit()->text();
 +        const QString fileNameExtension = QFileInfo(fileName).suffix();
 +        if (!fileNameExtension.isEmpty() && !newNameFilterExtension.isEmpty()) {
 +            const int fileNameExtensionLength = fileNameExtension.count();
 +            fileName.replace(fileName.count() - fileNameExtensionLength,
 +                             fileNameExtensionLength, newNameFilterExtension);
 +            qFileDialogUi->listView->clearSelection();
 +            lineEdit()->setText(fileName);
 +        }
 +    }
 +
 +    model->setNameFilters(newNameFilters);
 +}
 +
 +/*!
 +    \internal
 +
 +    This is called when the model index corresponding to the current file is changed
 +    from \a index to \a current.
 +*/
 +void QFileDialogPrivate::_q_selectionChanged()
 +{
 +    QModelIndexList indexes = qFileDialogUi->listView->selectionModel()->selectedRows();
 +    bool stripDirs = (fileMode != QFileDialog::DirectoryOnly && fileMode != QFileDialog::Directory);
 +
 +    QStringList allFiles;
 +    for (int i = 0; i < indexes.count(); ++i) {
 +        if (stripDirs && model->isDir(mapToSource(indexes.at(i))))
 +            continue;
 +        allFiles.append(indexes.at(i).data().toString());
 +    }
 +    if (allFiles.count() > 1)
 +        for (int i = 0; i < allFiles.count(); ++i) {
 +            allFiles.replace(i, QString(QLatin1Char('"') + allFiles.at(i) + QLatin1Char('"')));
 +    }
 +
 +    QString finalFiles = allFiles.join(QLatin1String(" "));
 +    if (!finalFiles.isEmpty() && !lineEdit()->hasFocus() && lineEdit()->isVisible())
 +        lineEdit()->setText(finalFiles);
 +    else
 +        _q_updateOkButton();
 +}
 +
 +/*!
 +    \internal
 +
 +    Includes hidden files and directories in the items displayed in the dialog.
 +*/
 +void QFileDialogPrivate::_q_showHidden()
 +{
 +    Q_Q(QFileDialog);
 +    QDir::Filters dirFilters = q->filter();
 +    if (showHiddenAction->isChecked())
 +        dirFilters |= QDir::Hidden;
 +    else
 +        dirFilters &= ~QDir::Hidden;
 +    q->setFilter(dirFilters);
 +}
 +
 +/*!
 +    \internal
 +
 +    When parent is root and rows have been inserted when none was there before
 +    then select the first one.
 +*/
 +void QFileDialogPrivate::_q_rowsInserted(const QModelIndex &parent)
 +{
 +    if (!qFileDialogUi->treeView
 +        || parent != qFileDialogUi->treeView->rootIndex()
 +        || !qFileDialogUi->treeView->selectionModel()
 +        || qFileDialogUi->treeView->selectionModel()->hasSelection()
 +        || qFileDialogUi->treeView->model()->rowCount(parent) == 0)
 +        return;
 +}
 +
 +void QFileDialogPrivate::_q_fileRenamed(const QString &path, const QString oldName, const QString newName)
 +{
 +    if (fileMode == QFileDialog::Directory || fileMode == QFileDialog::DirectoryOnly) {
 +        if (path == rootPath() && lineEdit()->text() == oldName)
 +            lineEdit()->setText(newName);
 +    }
 +}
 +
 +/*!
 +    \internal
 +
 +    For the list and tree view watch keys to goto parent and back in the history
 +
 +    returns true if handled
 +*/
 +bool QFileDialogPrivate::itemViewKeyboardEvent(QKeyEvent *event) {
 +
 +    Q_Q(QFileDialog);
 +    switch (event->key()) {
 +    case Qt::Key_Backspace:
 +        _q_navigateToParent();
 +        return true;
 +    case Qt::Key_Back:
 +#ifdef QT_KEYPAD_NAVIGATION
 +        if (QApplication::keypadNavigationEnabled())
 +            return false;
 +#endif
 +    case Qt::Key_Left:
 +        if (event->key() == Qt::Key_Back || event->modifiers() == Qt::AltModifier) {
 +            _q_navigateBackward();
 +            return true;
 +        }
 +        break;
 +    case Qt::Key_Escape:
 +        q->hide();
 +        return true;
 +    default:
 +        break;
 +    }
 +    return false;
 +}
 +
 +QString QFileDialogPrivate::getEnvironmentVariable(const QString &string)
 +{
 +#ifdef Q_OS_UNIX
 +    if (string.size() > 1 && string.startsWith(QLatin1Char('$'))) {
 +        return QString::fromLocal8Bit(getenv(string.mid(1).toLatin1().constData()));
 +    }
 +#else
 +    if (string.size() > 2 && string.startsWith(QLatin1Char('%')) && string.endsWith(QLatin1Char('%'))) {
 +        return QString::fromLocal8Bit(qgetenv(string.mid(1, string.size() - 2).toLatin1().constData()));
 +    }
 +#endif
 +    return string;
 +}
 +
 +void QFileDialogComboBox::init(QFileDialogPrivate *d_pointer) {
 +    d_ptr = d_pointer;
 +    urlModel = new QUrlModel(this);
 +    urlModel->showFullPath = true;
 +    urlModel->setFileSystemModel(d_ptr->model);
 +    setModel(urlModel);
 +}
 +
 +void QFileDialogComboBox::showPopup()
 +{
 +    if (model()->rowCount() > 1)
 +        QComboBox::showPopup();
 +
 +    urlModel->setUrls(QList<QUrl>());
 +    QList<QUrl> list;
 +    QModelIndex idx = d_ptr->model->index(d_ptr->rootPath());
 +    while (idx.isValid()) {
 +        QUrl url = QUrl::fromLocalFile(idx.data(QFileSystemModel::FilePathRole).toString());
 +        if (url.isValid())
 +            list.append(url);
 +        idx = idx.parent();
 +    }
 +    // add "my computer"
 +    list.append(QUrl::fromLocalFile(QLatin1String("")));
 +    urlModel->addUrls(list, 0);
 +    idx = model()->index(model()->rowCount() - 1, 0);
 +
 +    // append history
 +    QList<QUrl> urls;
 +    for (int i = 0; i < m_history.count(); ++i) {
 +        QUrl path = QUrl::fromLocalFile(m_history.at(i));
 +        if (!urls.contains(path))
 +            urls.prepend(path);
 +    }
 +    if (urls.count() > 0) {
 +        model()->insertRow(model()->rowCount());
 +        idx = model()->index(model()->rowCount()-1, 0);
 +        // ### TODO maybe add a horizontal line before this
 +        model()->setData(idx, QFileDialog::tr("Recent Places"));
 +        QStandardItemModel *m = qobject_cast<QStandardItemModel*>(model());
 +        if (m) {
 +            Qt::ItemFlags flags = m->flags(idx);
 +            flags &= ~Qt::ItemIsEnabled;
 +            m->item(idx.row(), idx.column())->setFlags(flags);
 +        }
 +        urlModel->addUrls(urls, -1, false);
 +    }
 +    setCurrentIndex(0);
 +
 +    QComboBox::showPopup();
 +}
 +
 +// Exact same as QComboBox::paintEvent(), except we elide the text.
 +void QFileDialogComboBox::paintEvent(QPaintEvent *)
 +{
 +    QStylePainter painter(this);
 +    painter.setPen(palette().color(QPalette::Text));
 +
 +    // draw the combobox frame, focusrect and selected etc.
 +    QStyleOptionComboBox opt;
 +    initStyleOption(&opt);
 +
 +    QRect editRect = style()->subControlRect(QStyle::CC_ComboBox, &opt,
 +                                                QStyle::SC_ComboBoxEditField, this);
 +    int size = editRect.width() - opt.iconSize.width() - 4;
 +    opt.currentText = opt.fontMetrics.elidedText(opt.currentText, Qt::ElideMiddle, size);
 +    painter.drawComplexControl(QStyle::CC_ComboBox, opt);
 +
 +    // draw the icon and text
 +    painter.drawControl(QStyle::CE_ComboBoxLabel, opt);
 +}
 +
 +QFileDialogListView::QFileDialogListView(QWidget *parent) : QListView(parent)
 +{
 +}
 +
 +void QFileDialogListView::init(QFileDialogPrivate *d_pointer)
 +{
 +    d_ptr = d_pointer;
 +    setSelectionBehavior(QAbstractItemView::SelectRows);
 +    setWrapping(true);
 +    setResizeMode(QListView::Adjust);
 +    setEditTriggers(QAbstractItemView::EditKeyPressed);
 +    setContextMenuPolicy(Qt::CustomContextMenu);
 +#ifndef QT_NO_DRAGANDDROP
 +    setDragDropMode(QAbstractItemView::InternalMove);
 +#endif
 +}
 +
 +QSize QFileDialogListView::sizeHint() const
 +{
 +    int height = qMax(10, sizeHintForRow(0));
 +    return QSize(QListView::sizeHint().width() * 2, height * 30);
 +}
 +
 +void QFileDialogListView::keyPressEvent(QKeyEvent *e)
 +{
 +#ifdef QT_KEYPAD_NAVIGATION
 +    if (QApplication::navigationMode() == Qt::NavigationModeKeypadDirectional) {
 +        QListView::keyPressEvent(e);
 +        return;
 +    }
 +#endif // QT_KEYPAD_NAVIGATION
 +
 +    if (!d_ptr->itemViewKeyboardEvent(e))
 +        QListView::keyPressEvent(e);
 +    e->accept();
 +}
 +
 +QFileDialogTreeView::QFileDialogTreeView(QWidget *parent) : QTreeView(parent)
 +{
 +}
 +
 +void QFileDialogTreeView::init(QFileDialogPrivate *d_pointer)
 +{
 +    d_ptr = d_pointer;
 +    setSelectionBehavior(QAbstractItemView::SelectRows);
 +    setRootIsDecorated(false);
 +    setItemsExpandable(false);
 +    setSortingEnabled(true);
 +    header()->setSortIndicator(0, Qt::AscendingOrder);
 +    header()->setStretchLastSection(false);
 +    setTextElideMode(Qt::ElideMiddle);
 +    setEditTriggers(QAbstractItemView::EditKeyPressed);
 +    setContextMenuPolicy(Qt::CustomContextMenu);
 +#ifndef QT_NO_DRAGANDDROP
 +    setDragDropMode(QAbstractItemView::InternalMove);
 +#endif
 +}
 +
 +void QFileDialogTreeView::keyPressEvent(QKeyEvent *e)
 +{
 +#ifdef QT_KEYPAD_NAVIGATION
 +    if (QApplication::navigationMode() == Qt::NavigationModeKeypadDirectional) {
 +        QTreeView::keyPressEvent(e);
 +        return;
 +    }
 +#endif // QT_KEYPAD_NAVIGATION
 +
 +    if (!d_ptr->itemViewKeyboardEvent(e))
 +        QTreeView::keyPressEvent(e);
 +    e->accept();
 +}
 +
 +QSize QFileDialogTreeView::sizeHint() const
 +{
 +    int height = qMax(10, sizeHintForRow(0));
 +    QSize sizeHint = header()->sizeHint();
 +    return QSize(sizeHint.width() * 4, height * 30);
 +}
 +
 +/*!
 +    // FIXME: this is a hack to avoid propagating key press events
 +    // to the dialog and from there to the "Ok" button
 +*/
 +void QFileDialogLineEdit::keyPressEvent(QKeyEvent *e)
 +{
 +#ifdef QT_KEYPAD_NAVIGATION
 +    if (QApplication::navigationMode() == Qt::NavigationModeKeypadDirectional) {
 +        QLineEdit::keyPressEvent(e);
 +        return;
 +    }
 +#endif // QT_KEYPAD_NAVIGATION
 +
 +    int key = e->key();
 +    QLineEdit::keyPressEvent(e);
 +    if (key != Qt::Key_Escape)
 +        e->accept();
 +    if (hideOnEsc && (key == Qt::Key_Escape || key == Qt::Key_Return || key == Qt::Key_Enter)) {
 +        e->accept();
 +        hide();
 +        d_ptr->currentView()->setFocus(Qt::ShortcutFocusReason);
 +    }
 +}
 +
 +#ifndef QT_NO_FSCOMPLETER
 +
 +QString QFSCompleter::pathFromIndex(const QModelIndex &index) const
 +{
 +    const QFileSystemModel *dirModel;
 +    if (proxyModel)
 +        dirModel = qobject_cast<const QFileSystemModel *>(proxyModel->sourceModel());
 +    else
 +        dirModel = sourceModel;
 +    QString currentLocation = dirModel->rootPath();
 +    QString path = index.data(QFileSystemModel::FilePathRole).toString();
 +    if (!currentLocation.isEmpty() && path.startsWith(currentLocation)) {
 +#if defined(Q_OS_UNIX) || defined(Q_OS_WINCE)
 +        if (currentLocation == QDir::separator())
 +            return path.mid(currentLocation.length());
 +#endif
 +        if (currentLocation.endsWith(QLatin1Char('/')))
 +            return path.mid(currentLocation.length());
 +        else
 +            return path.mid(currentLocation.length()+1);
 +    }
 +    return index.data(QFileSystemModel::FilePathRole).toString();
 +}
 +
 +QStringList QFSCompleter::splitPath(const QString &path) const
 +{
 +    if (path.isEmpty())
 +        return QStringList(completionPrefix());
 +
 +    QString pathCopy = QDir::toNativeSeparators(path);
 +    QString sep = QDir::separator();
 +#if defined(Q_OS_SYMBIAN)
 +    if (pathCopy == QLatin1String("\\"))
 +        return QStringList(pathCopy);
 +#elif defined(Q_OS_WIN)
 +    if (pathCopy == QLatin1String("\\") || pathCopy == QLatin1String("\\\\"))
 +        return QStringList(pathCopy);
 +    QString doubleSlash(QLatin1String("\\\\"));
 +    if (pathCopy.startsWith(doubleSlash))
 +        pathCopy = pathCopy.mid(2);
 +    else
 +        doubleSlash.clear();
++#elif defined(Q_OS_UNIX)
++    bool expanded;
++    pathCopy = qt_tildeExpansion(pathCopy, &expanded);
++    if (expanded) {
++        QFileSystemModel *dirModel;
++        if (proxyModel)
++            dirModel = qobject_cast<QFileSystemModel *>(proxyModel->sourceModel());
++        else
++            dirModel = sourceModel;
++        dirModel->fetchMore(dirModel->index(pathCopy));
++    }
 +#endif
 +
 +    QRegExp re(QLatin1Char('[') + QRegExp::escape(sep) + QLatin1Char(']'));
 +
 +#if defined(Q_OS_SYMBIAN)
 +    QStringList parts = pathCopy.split(re, QString::SkipEmptyParts);
 +    if (pathCopy.endsWith(sep))
 +        parts.append(QString());
 +#elif defined(Q_OS_WIN)
 +    QStringList parts = pathCopy.split(re, QString::SkipEmptyParts);
 +    if (!doubleSlash.isEmpty() && !parts.isEmpty())
 +        parts[0].prepend(doubleSlash);
 +    if (pathCopy.endsWith(sep))
 +        parts.append(QString());
 +#else
 +    QStringList parts = pathCopy.split(re);
-     bool startsFromRoot = path[0] == sep[0];
++    if (pathCopy[0] == sep[0]) // read the "/" at the beginning as the split removed it
 +        parts[0] = sep[0];
 +#endif
 +
 +#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
 +    bool startsFromRoot = !parts.isEmpty() && parts[0].endsWith(QLatin1Char(':'));
 +#else
++    bool startsFromRoot = pathCopy[0] == sep[0];
 +#endif
 +    if (parts.count() == 1 || (parts.count() > 1 && !startsFromRoot)) {
 +        const QFileSystemModel *dirModel;
 +        if (proxyModel)
 +            dirModel = qobject_cast<const QFileSystemModel *>(proxyModel->sourceModel());
 +        else
 +            dirModel = sourceModel;
 +        QString currentLocation = QDir::toNativeSeparators(dirModel->rootPath());
 +#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
 +        if (currentLocation.endsWith(QLatin1Char(':')))
 +            currentLocation.append(sep);
 +#endif
 +        if (currentLocation.contains(sep) && path != currentLocation) {
 +            QStringList currentLocationList = splitPath(currentLocation);
 +            while (!currentLocationList.isEmpty()
 +                   && parts.count() > 0
 +                   && parts.at(0) == QLatin1String("..")) {
 +                parts.removeFirst();
 +                currentLocationList.removeLast();
 +            }
 +            if (!currentLocationList.isEmpty() && currentLocationList.last().isEmpty())
 +                currentLocationList.removeLast();
 +            return currentLocationList + parts;
 +        }
 +    }
 +    return parts;
 +}
 +
 +#endif // QT_NO_COMPLETER
 +
 +#ifdef QT3_SUPPORT
 +/*!
 +    Use selectedFiles() instead.
 +
 +    \oldcode
 +       QString selected = dialog->selectedFile();
 +    \newcode
 +        QStringList files = dialog->selectedFiles();
 +        QString selected;
 +        if (!files.isEmpty())
 +            selected = files[0];
 +    \endcode
 +*/
 +QString QFileDialog::selectedFile() const
 +{
 +    QStringList files = selectedFiles();
 +    return files.size() ? files.at(0) : QString();
 +}
 +
 +/*!
 +    \typedef QFileDialog::Mode
 +
 +    Use QFileDialog::FileMode instead.
 +*/
 +
 +/*!
 +    \fn void QFileDialog::setMode(FileMode m)
 +
 +    Use setFileMode() instead.
 +*/
 +
 +/*!
 +    \fn FileMode QFileDialog::mode() const
 +
 +    Use fileMode() instead.
 +*/
 +
 +/*!
 +    \fn void QFileDialog::setDir(const QString &directory)
 +
 +    Use setDirectory() instead.
 +*/
 +
 +/*!
 +    \fn void QFileDialog::setDir( const QDir &directory )
 +
 +    Use setDirectory() instead.
 +*/
 +
 +/*!
 +    \fn QStringList QFileDialog::getOpenFileNames(const QString &filter,
 +        const QString &dir, QWidget *parent, const char* name,
 +        const QString &caption, QString *selectedFilter, bool resolveSymlinks)
 +
 +    Use the getOpenFileNames() overload that takes \a parent as the first
 +    argument instead.
 +*/
 +
 +/*!
 +    \fn QString QFileDialog::getOpenFileName(const QString &dir,
 +        const QString &filter, QWidget *parent = 0, const char *name,
 +        const QString &caption, QString *selectedFilter, bool resolveSymlinks)
 +
 +    Use the getOpenFileName() overload that takes \a parent as the first
 +    argument instead.
 +*/
 +
 +/*!
 +    \fn QString QFileDialog::getSaveFileName(const QString &dir,
 +        const QString &filter, QWidget *parent, const char *name,
 +        const QString &caption, QString *selectedFilter, bool resolveSymlinks)
 +
 +    Use the getSaveFileName() overload that takes \a parent as the first
 +    argument instead.
 +*/
 +
 +/*!
 +    \fn QString QFileDialog::getExistingDirectory(const QString &dir,
 +        QWidget *parent, const char *name, const QString &caption,
 +        bool dirOnly, bool resolveSymlinks)
 +
 +    Use the getExistingDirectory() overload that takes \a parent as
 +    the first argument instead.
 +*/
 +
 +#endif // QT3_SUPPORT
 +
 +QT_END_NAMESPACE
 +
 +#include "moc_qfiledialog.cpp"
 +
 +#endif // QT_NO_FILEDIALOG