Changeset 471 for trunk/src/gui/kernel
- Timestamp:
- Jan 25, 2010, 5:03:17 PM (16 years ago)
- Location:
- trunk/src/gui/kernel
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/gui/kernel/qdnd_pm.cpp
r470 r471 611 611 DrgFreeDraginfo(info); 612 612 613 DEBUG(("DM_DRAGOVER: return %08lx default %08lx", 614 dropReply, toPmDragDropOp(dragData->lastAction))); 613 615 return MRFROM2SHORT(dropReply, toPmDragDropOp(dragData->lastAction)); 614 616 } … … 913 915 } 914 916 915 if (!mimeData->formats().count()) {916 // The drag source doesn't provide any format, so we've got no workers.917 // Although it may look strange, but it is a supported case: for918 // example, designer uses it a lot for in-process DnD. Instead of MIME919 // data, it works directly with the QMimeData object from the drag920 // source. We will go through the converters passing a special value of921 // QString::null as MIME type -- one of them (e.g. QPMAnyMime) should922 // take it over and return itself.923 Q_ASSERT(!workers.count());924 DEBUG(() << "QPMCoopDragWorker: Source provides NO data, looking for a "925 "converter that can handle this");926 foreach (QPMMime *mime, QPMMime::all()) {927 DragWorker *wrk = mime->dragWorkerFor(QString::null, mimeData);928 if (wrk) {929 workers.append(wrk);930 break;931 }932 }933 }934 935 917 #if defined(QDND_DEBUG) 936 918 foreach (DragWorker *wrk, workers) { … … 941 923 #endif 942 924 925 if (!mimeData->formats().count()) { 926 // The drag source doesn't provide any format, so we've got no workers. 927 // Although it may look strange, it is a supported case: for example, 928 // designer uses it a lot for in-process DnD. Instead of MIME data, it 929 // works directly with the QMimeData object from the drag source. We 930 // will handle this situation by providing a dummy DRAGINFO structure. 931 DEBUG(() << "QPMCoopDragWorker: Source provides NO data, will use " 932 "dummy DRAGINFO"); 933 Q_ASSERT(!workers.count()); 934 return true; 935 } 936 943 937 Q_ASSERT(workers.count() > 0); 944 938 return workers.count() > 0; … … 947 941 HWND QPMCoopDragWorker::hwnd() const 948 942 { 949 DragWorker *firstWorker = workers.first();950 Q_ASSERT(firstWorker);951 if (!firstWorker)952 return 0;953 954 if (firstWorker->isExclusive() && firstWorker->itemCount() == 0) {955 // this is a super exclusive worker that will do everything on its own956 return firstWorker->hwnd();943 if (!workers.count()) { 944 // The drag source doesn't provide any format; will handle it ourselves 945 } else { 946 DragWorker *firstWorker = workers.first(); 947 if (firstWorker->isExclusive() && firstWorker->itemCount() == 0) { 948 // this is a super exclusive worker that will do everything on its own 949 return firstWorker->hwnd(); 950 } 957 951 } 958 952 … … 989 983 if (info) 990 984 return 0; 985 986 if (!workers.count()) { 987 // The drag source doesn't provide any format; provide a dummy DRAGINFO 988 // with a null DRAGITEM that we will never render 989 info = DrgAllocDraginfo(1); 990 Q_ASSERT(info); 991 if (!info) 992 return 0; 993 994 DRAGITEM *item = DrgQueryDragitemPtr(info, 0); 995 Q_ASSERT(item); 996 if (!item) { 997 DrgFreeDraginfo(info); 998 info = 0; 999 return 0; 1000 } 1001 1002 item->hwndItem = hwnd(); 1003 item->ulItemID = 0; 1004 item->hstrType = 0; 1005 item->hstrRMF = 0; 1006 item->hstrContainerName = 0; 1007 item->hstrSourceName = 0; 1008 item->hstrTargetName = 0; 1009 item->cxOffset = 0; 1010 item->cyOffset = 0; 1011 item->fsControl = DC_PREPARE; // require DM_RENDERPREPARE from target 1012 item->fsSupportedOps = supportedOps; 1013 1014 return info; 1015 } 991 1016 992 1017 DragWorker *firstWorker = workers.first(); -
trunk/src/gui/kernel/qmime_pm.cpp
r470 r471 365 365 return formats; 366 366 367 if (qstrcmp(formats, "DRF_NULL") == 0) { 368 // special case, see QPMMimeAnyMime::dragWorkerFor() 369 formats = "<DRM_NULL," + formats + ">"; 370 } else { 371 // DRM_SHAREDMEM comes first to prevent native DRM_OS2FILE 372 // rendering on the target side w/o involving the source. 373 // Also, we add <DRM_SHAREDMEM,DRF_POINTERDATA> just like WPS does it 374 // (however, it doesn't help when dropping objects to it -- WPS still 375 // chooses DRM_OS2FILE). 376 formats = "(DRM_SHAREDMEM,DRM_OS2FILE)x(" + formats + ")," 377 "<DRM_SHAREDMEM,DRF_POINTERDATA>"; 378 } 367 // DRM_SHAREDMEM comes first to prevent native DRM_OS2FILE 368 // rendering on the target side w/o involving the source. 369 // Also, we add <DRM_SHAREDMEM,DRF_POINTERDATA> just like WPS does it 370 // (however, it doesn't help when dropping objects to it -- WPS still 371 // chooses DRM_OS2FILE). 372 formats = "(DRM_SHAREDMEM,DRM_OS2FILE)x(" + formats + ")," 373 "<DRM_SHAREDMEM,DRF_POINTERDATA>"; 379 374 380 375 DEBUG(() << "DefaultDragWorker: formats" << formats … … 832 827 if (!provider) 833 828 return ret; 834 835 if (mimeType.isEmpty()) {836 // special case, see QPMMimeAnyMime::dropWorkerFor()837 return ret;838 }839 829 840 830 QByteArray drf = provider->drf(mimeType); … … 1127 1117 Provider *provider) 1128 1118 { 1129 // note: as a special case, mimeType may be null (see 1130 // QPMCoopDragWorker::collectWorkers()) 1131 1132 Q_ASSERT(provider); 1133 if (provider && !d->exclusive) { 1119 Q_ASSERT(!mimeType.isEmpty() && provider); 1120 if (!mimeType.isEmpty() && provider && !d->exclusive) { 1134 1121 // ensure there are no dups (several providers for the same mime) 1135 1122 if (!d->providerFor(mimeType)) … … 1304 1291 { 1305 1292 ULONG cf = WinAddAtom(WinQuerySystemAtomTable(), mime.toLocal8Bit()); 1293 if (!cf) { 1306 1294 #ifndef QT_NO_DEBUG 1307 if (!cf)1308 1295 qWarning("QPMMime: WinAddAtom failed with 0x%lX", 1309 1296 WinGetLastError(NULLHANDLE)); 1310 1297 #endif 1298 return 0; 1299 } 1311 1300 1312 1301 return cf; … … 2734 2723 QString &type, QString &ext) 2735 2724 { 2736 if (qstrcmp(drf, "DRF_NULL") == 0) { 2737 // special case (see QPMMimeAnyMime::dragWorkerFor()) 2738 type = QString::null; 2739 } else { 2740 // file type = mime 2741 type = format(drf); 2742 Q_ASSERT(!type.isEmpty()); 2743 } 2725 // file type = mime 2726 type = format(drf); 2727 Q_ASSERT(!type.isEmpty()); 2744 2728 2745 2729 // no way to determine the extension … … 2775 2759 QMimeData *mimeData) 2776 2760 { 2777 if (mimeType.isEmpty()) {2778 // special case: QMimeData with no formats() (see2779 // QPMCoopDragWorker::collectWorkers())2780 Q_ASSERT(!mimeData->formats().count());2781 // add an exclusive provider with a special format DRF_NULL. Note that2782 // any attemt to render this format should fail so we don't expect2783 // AnyDragProvider::format()/provide() to be actually called.2784 DefaultDragWorker *defWorker = defaultExclDragWorker();2785 defWorker->addProvider(QByteArray("DRF_NULL"), &anyDragProvider);2786 return defWorker;2787 }2788 2789 2761 ULONG cf = cfMap.value(mimeType); 2790 2762 if (!cf) … … 2816 2788 DefaultDropWorker *defWorker = defaultDropWorker(); 2817 2789 bool atLeastOneSupported = false; 2818 2819 if (qstrcmp(queryHSTR(item->hstrRMF), "<DRM_NULL,DRF_NULL>") == 0) {2820 // special case: QMimeData with no formats() (see2821 // QPMCoopDragWorker::collectWorkers()), use a special MIME format2822 // value of null. Note that any attemt to retrieve data in this2823 // format should fail so we don't expect AnyDropProvider::drf()/2824 // provide() to be actually called.2825 defWorker->addProvider(QString::null, &anyDropProvider);2826 return defWorker;2827 }2828 2790 2829 2791 // check that we support one of DRMs and the format is CF_hhhhhhh … … 2902 2864 if (atomStr.startsWith(mimePrefix)) { 2903 2865 // the format represents the mime type we can recognize 2866 // increase the reference count 2867 ULONG cf = QPMMime::registerMimeType(atomStr); 2868 Q_ASSERT(cf == format); 2904 2869 // extract the real mime type (w/o our prefix) 2905 2870 mime = atomStr.mid(mimePrefix.size()); 2906 Q_ASSERT(!mime.isEmpty());2907 2871 if (!mime.isEmpty()) { 2908 // increase the reference count (will decrease on destruction)2909 ULONG cf = QPMMime::registerMimeType(atomStr);2910 Q_ASSERT(cf == format);2911 2872 cfMap[mime] = cf; 2912 2873 mimeMap[cf] = mime;
Note:
See TracChangeset
for help on using the changeset viewer.