cclipboard.cpp
来自「Gambas is a graphical development enviro」· C++ 代码 · 共 429 行
CPP
429 行
/*************************************************************************** CClipboard.cpp (c) 2000-2003 Beno顃 Minisini <gambas@users.sourceforge.net> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.***************************************************************************/#define __CCLIPBOARD_CPP#include "gambas.h"#include <qapplication.h>#include <qmime.h>#include <qclipboard.h>#include <qimage.h>#include <qpicture.h>#include <qdragobject.h>#include <qcstring.h>#include <qevent.h>#include "CWidget.h"#include "CImage.h"#include "CClipboard.h"CDRAG_INFO CDRAG_info = { 0 };static void *CLASS_Image;//static CCURSOR *_cursor = 0;static CPICTURE *_picture = 0;static int get_type(QMimeSource *src){ if (QTextDrag::canDecode(src)) return 1; else if (QImageDrag::canDecode(src)) return 2; else return 0;}static QCString get_format(QMimeSource *src){ QCString format = src->format(); int pos; pos = format.find(';'); if (pos >= 0) format = format.left(pos); return format;}static void paste(QMimeSource *data, char *fmt){ CIMAGE *img; if (fmt) { if (get_format(data) != QCString(fmt)) { GB.ReturnNull(); return; } } if (QTextDrag::canDecode(data)) { QString text; QTextDrag::decode(data, text); GB.ReturnNewZeroString(text.latin1()); } else if (QImageDrag::canDecode(data)) { GB.New((void **)&img, GB.FindClass("Image"), 0, 0); QImageDrag::decode(data, *(img->image)); img->image->convertDepth(32); GB.ReturnObject(img); } else GB.ReturnNull();}/*************************************************************************** Clipboard***************************************************************************/BEGIN_METHOD_VOID(CCLIPBOARD_init) CLASS_Image = GB.FindClass("Image");END_METHODBEGIN_METHOD_VOID(CCLIPBOARD_clear) QApplication::clipboard()->clear();END_METHODBEGIN_PROPERTY(CCLIPBOARD_format) GB.ReturnNewZeroString(get_format(QApplication::clipboard()->data()));END_PROPERTYBEGIN_PROPERTY(CCLIPBOARD_type) GB.ReturnInteger(get_type(QApplication::clipboard()->data()));END_PROPERTYBEGIN_METHOD(CCLIPBOARD_copy, GB_VARIANT data; GB_STRING format) QCString format; if (VARG(data).type == GB_T_STRING) { QTextDrag *drag = new QTextDrag(); if (MISSING(format)) format = "plain"; else { format = GB.ToZeroString(ARG(format)); if (format.left(5) != "text/") goto _BAD_FORMAT; format = format.mid(5); if (format.length() == 0) goto _BAD_FORMAT; } drag->setText(VARG(data)._string.value); drag->setSubtype(format); QApplication::clipboard()->setData(drag); } else if (VARG(data).type >= GB_T_OBJECT && GB.Is(VARG(data)._object.value, CLASS_Image)) { CIMAGE *img; if (!MISSING(format)) goto _BAD_FORMAT; img = (CIMAGE *)VARG(data)._object.value; QApplication::clipboard()->setImage(*(img->image)); } else goto _BAD_FORMAT; return;_BAD_FORMAT: GB.Error("Bad clipboard format");END_METHODBEGIN_METHOD(CCLIPBOARD_paste, GB_STRING format) paste(QApplication::clipboard()->data(), MISSING(format) ? NULL : GB.ToZeroString(ARG(format)));END_METHODGB_DESC CClipboardDesc[] ={ GB_DECLARE("Clipboard", 0), GB_VIRTUAL_CLASS(), GB_CONSTANT("None", "i", 0), GB_CONSTANT("Text", "i", 1), GB_CONSTANT("Image", "i", 2), GB_STATIC_METHOD("_init", NULL, CCLIPBOARD_init, NULL), GB_STATIC_METHOD("Clear", NULL, CCLIPBOARD_clear, NULL), GB_STATIC_PROPERTY_READ("Format", "s", CCLIPBOARD_format), GB_STATIC_PROPERTY_READ("Type", "i", CCLIPBOARD_type), GB_STATIC_METHOD("Copy", NULL, CCLIPBOARD_copy, "(Data)v[(Format)s]"), GB_STATIC_METHOD("Paste", "v", CCLIPBOARD_paste, "[(Format)s]"), GB_END_DECLARE};/*************************************************************************** Drag***************************************************************************/void CDRAG_clear(bool valid){ if (valid) CDRAG_info.valid++; else CDRAG_info.valid--; if (CDRAG_info.valid == 0) CLEAR(&CDRAG_info);}void CDRAG_drag(CWIDGET *source, GB_VARIANT_VALUE *data, GB_STRING *fmt){ QDragObject *drag; QCString format; CIMAGE *img; if (GB.CheckObject(source)) return; if (data->type == GB_T_STRING) { drag = new QTextDrag(source->widget); if (fmt == NULL) format = "plain"; else { format = GB.ToZeroString(fmt); if (format.left(5) != "text/") goto _BAD_FORMAT; format = format.mid(5); if (format.length() == 0) goto _BAD_FORMAT; } ((QTextDrag *)drag)->setText(data->_string.value); ((QTextDrag *)drag)->setSubtype(format); } else if (data->type >= GB_T_OBJECT && GB.Is(data->_object.value, CLASS_Image)) { if (fmt) goto _BAD_FORMAT; drag = new QImageDrag(source->widget); img = (CIMAGE *)data->_object.value; ((QImageDrag *)drag)->setImage(*(img->image)); } else goto _BAD_FORMAT; if (_picture) { //QPoint p(_cursor->x, _cursor->y); //pict = _cursor->picture; drag->setPixmap(*(_picture->pixmap)); } drag->drag(); return;_BAD_FORMAT: GB.Error("Bad drag format");}BEGIN_METHOD(CDRAG_call, GB_OBJECT source; GB_VARIANT data; GB_STRING format) CDRAG_drag((CWIDGET *)VARG(source), &VARG(data), MISSING(format) ? NULL : ARG(format));END_METHODBEGIN_METHOD_VOID(CDRAG_exit) GB.Unref((void **)&_picture);END_METHODBEGIN_PROPERTY(CDRAG_picture) if (READ_PROPERTY) GB.ReturnObject(_picture); else GB.StoreObject(PROP(GB_OBJECT), (void **)&_picture);END_PROPERTY#define CHECK_VALID() \ if (!CDRAG_info.valid) \ { \ GB.Error("No drag data"); \ return; \ }BEGIN_PROPERTY(CDRAG_type) CHECK_VALID(); GB.ReturnInteger(get_type(CDRAG_info.drop));END_PROPERTYBEGIN_PROPERTY(CDRAG_format) CHECK_VALID(); GB.ReturnNewZeroString(get_format(CDRAG_info.drop));END_PROPERTYBEGIN_PROPERTY(CDRAG_data) if (!CDRAG_info.valid) { GB.ReturnNull(); return; } paste(CDRAG_info.drop, NULL);END_PROPERTYBEGIN_PROPERTY(CDRAG_action) CHECK_VALID(); switch(CDRAG_info.drop->action()) { case QDropEvent::Link: GB.ReturnInteger(1); break; case QDropEvent::Move: GB.ReturnInteger(2); break; default: GB.ReturnInteger(1); break; }END_PROPERTYBEGIN_PROPERTY(CDRAG_source) CHECK_VALID(); GB.ReturnObject(CWidget::get(CDRAG_info.drop->source()));END_PROPERTYBEGIN_PROPERTY(CDRAG_x) CHECK_VALID(); GB.ReturnInteger(CDRAG_info.x);END_PROPERTYBEGIN_PROPERTY(CDRAG_y) CHECK_VALID(); GB.ReturnInteger(CDRAG_info.y);END_PROPERTYGB_DESC CDragDesc[] ={ GB_DECLARE("Drag", 0), GB_VIRTUAL_CLASS(), GB_CONSTANT("None", "i", 0), GB_CONSTANT("Text", "i", 1), GB_CONSTANT("Image", "i", 2), GB_CONSTANT("Copy", "i", 0), GB_CONSTANT("Link", "i", 1), GB_CONSTANT("Move", "i", 2), GB_STATIC_PROPERTY("Icon", "Picture", CDRAG_picture), GB_STATIC_PROPERTY_READ("Data", "v", CDRAG_data), GB_STATIC_PROPERTY_READ("Format", "s", CDRAG_format), GB_STATIC_PROPERTY_READ("Type", "i", CDRAG_type), GB_STATIC_PROPERTY_READ("Action", "i", CDRAG_action), GB_STATIC_PROPERTY_READ("Source", "Control", CDRAG_source), GB_STATIC_PROPERTY_READ("X", "i", CDRAG_x), GB_STATIC_PROPERTY_READ("Y", "i", CDRAG_y), GB_STATIC_METHOD("_call", NULL, CDRAG_call, "(Source)Control;(Data)v[(Format)s]"), GB_STATIC_METHOD("_exit", NULL, CDRAG_exit, NULL), GB_END_DECLARE};
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?