49e21120b6
Use show(argc,argv) to enable command line arguments and colors, fix indentation, Windows compilation warnings, and change tab selection color, which was too dark on my Win7 system (low contrast with tab labels). I also added #define TAB_COLOR to make changing the tab selection colors easier, if needed. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@10318 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
171 lines
5.6 KiB
C++
171 lines
5.6 KiB
C++
//
|
|
// "$Id$"
|
|
//
|
|
// Clipboard display test application for the Fast Light Tool Kit (FLTK).
|
|
//
|
|
// Copyright 1998-2014 by Bill Spitzak and others.
|
|
//
|
|
// This library is free software. Distribution and use rights are outlined in
|
|
// the file "COPYING" which should have been included with this file. If this
|
|
// file is missing or damaged, see the license at:
|
|
//
|
|
// http://www.fltk.org/COPYING.php
|
|
//
|
|
// Please report all bugs and problems on the following page:
|
|
//
|
|
// http://www.fltk.org/str.php
|
|
//
|
|
|
|
#include <FL/Fl_Window.H>
|
|
#include <FL/Fl_Box.H>
|
|
#include <FL/Fl_Image.H>
|
|
#include <FL/Fl_Text_Buffer.H>
|
|
#include <FL/Fl_Text_Display.H>
|
|
#include <FL/Fl_Tabs.H>
|
|
#include <FL/Fl_Button.H>
|
|
#include <FL/Fl.H>
|
|
#include <FL/fl_draw.H>
|
|
|
|
/* Displays and follows the content of the clipboard with either image or text data
|
|
*/
|
|
|
|
Fl_Box *image_box;
|
|
Fl_Box *image_size;
|
|
Fl_Text_Display *display;
|
|
|
|
class chess : public Fl_Box { // a box with a chess-like pattern below its image
|
|
public:
|
|
chess(int x, int y, int w, int h) : Fl_Box(FL_FLAT_BOX,x,y,w,h,0) {
|
|
align(FL_ALIGN_CENTER | FL_ALIGN_CLIP);
|
|
}
|
|
void draw() {
|
|
draw_box();
|
|
Fl_Image *im = image();
|
|
if (im) { // draw the chess pattern below the box centered image
|
|
int X = x() + (w()-im->w())/2, Y = y() + (h()-im->h())/2, W = im->w(), H = im->h();
|
|
fl_push_clip(X,Y,W,H);
|
|
fl_push_clip(x(),y(),w(),h());
|
|
fl_color(FL_WHITE); fl_rectf(X,Y,W,H);
|
|
fl_color(FL_LIGHT2);
|
|
const int side = 4, side2 = 2*side;
|
|
for (int j=Y; j<Y+H; j+=side) {
|
|
for (int i=X + (j-Y)%side2; i<X+W; i+=side2) {
|
|
fl_rectf(i,j,side,side);
|
|
}
|
|
}
|
|
fl_pop_clip();
|
|
fl_pop_clip();
|
|
}
|
|
draw_label(); // draw the box image
|
|
}
|
|
} *chess_obj;
|
|
|
|
#define TAB_COLOR FL_DARK3
|
|
|
|
class clipboard_viewer : public Fl_Tabs { // use tabs to display as appropriate the image or textual content of the clipboard
|
|
public:
|
|
clipboard_viewer(int x, int y, int w, int h) : Fl_Tabs(x,y,w,h) {};
|
|
virtual int handle(int event) {
|
|
if (event != FL_PASTE) return Fl_Tabs::handle(event);
|
|
if (strcmp(Fl::event_clipboard_type(), Fl::clipboard_image) == 0) { // an image is being pasted
|
|
Fl_Image *im = (Fl_Image*)Fl::event_clipboard(); // get it as an Fl_Image object
|
|
if (!im) return 1;
|
|
char title[300];
|
|
sprintf(title, "%dx%d",im->w(), im->h()); // display the image original size
|
|
#ifdef WIN32
|
|
OpenClipboard(NULL); // display extra technical info about clipboard content
|
|
char *p=title + strlen(title);
|
|
int format = EnumClipboardFormats(0);
|
|
if (format && format < CF_MAX) { sprintf(p, " %d",format); p += strlen(p); }
|
|
while (format) {
|
|
format = EnumClipboardFormats(format);
|
|
if (format && format < CF_MAX) { sprintf(p, " %d",format); p += strlen(p); }
|
|
}
|
|
HANDLE h;
|
|
if ((h = GetClipboardData(CF_DIB))) {
|
|
LPBITMAPINFO lpBI = (LPBITMAPINFO)GlobalLock(h);
|
|
sprintf(p, " biBitCount=%d biCompression=%d biClrUsed=%d",
|
|
lpBI->bmiHeader.biBitCount, (int)lpBI->bmiHeader.biCompression, (int)lpBI->bmiHeader.biClrUsed);
|
|
}
|
|
CloseClipboard();
|
|
#endif
|
|
float scale_x = (float)im->w() / image_box->w(); // rescale the image if larger than the display box
|
|
float scale_y = (float)im->h() / image_box->h();
|
|
float scale = scale_x;
|
|
if (scale_y > scale) scale = scale_y;
|
|
if (scale > 1) {
|
|
Fl_Image *im2 = im->copy(im->w()/scale, im->h()/scale);
|
|
delete im;
|
|
im = im2;
|
|
}
|
|
Fl_Image *oldim = image_box->image();
|
|
if (oldim) delete oldim;
|
|
image_box->image(im); // show the scaled image
|
|
image_size->copy_label(title);
|
|
value(image_box->parent());
|
|
window()->redraw();
|
|
}
|
|
else { // text is being pasted
|
|
display->buffer()->text(Fl::event_text());
|
|
value(display);
|
|
display->redraw();
|
|
}
|
|
return 1;
|
|
}
|
|
} *tabs;
|
|
|
|
|
|
void cb(Fl_Widget *wid, clipboard_viewer *tabs)
|
|
{
|
|
if (Fl::clipboard_contains(Fl::clipboard_image)) {
|
|
Fl::paste(*tabs, 1, Fl::clipboard_image); // try to find image in the clipboard
|
|
return;
|
|
}
|
|
if (Fl::clipboard_contains(Fl::clipboard_plain_text)) Fl::paste(*tabs, 1, Fl::clipboard_plain_text); // also try to find text
|
|
}
|
|
|
|
void clip_callback(int source, void *data) { // called after clipboard was changed or at application activation
|
|
if ( source == 1 ) cb(NULL, (clipboard_viewer *)data);
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
#if !(defined(__APPLE__) || defined(WIN32))
|
|
extern void fl_register_images();
|
|
fl_register_images(); // required to allow pasting of images
|
|
#endif
|
|
Fl_Window* win = new Fl_Window(500, 550, "clipboard viewer");
|
|
tabs = new clipboard_viewer(0, 0, 500, 500);
|
|
Fl_Group *g = new Fl_Group( 5, 30, 490, 460, Fl::clipboard_image); // g will display the image form
|
|
g->box(FL_FLAT_BOX);
|
|
image_box = new chess(5, 30, 490, 450);
|
|
image_size = new Fl_Box(FL_NO_BOX, 5, 485, 490, 10, 0);
|
|
g->end();
|
|
g->selection_color(TAB_COLOR);
|
|
|
|
Fl_Text_Buffer *buffer = new Fl_Text_Buffer();
|
|
display = new Fl_Text_Display(5,30,490, 460, Fl::clipboard_plain_text); // display will display the text form
|
|
display->buffer(buffer);
|
|
display->selection_color(TAB_COLOR);
|
|
tabs->end();
|
|
tabs->resizable(display);
|
|
|
|
Fl_Group *g2 = new Fl_Group( 10,510,200,25);
|
|
Fl_Button *refresh = new Fl_Button(10,510,200,25, "Refresh from clipboard");
|
|
refresh->callback((Fl_Callback*)cb, tabs);
|
|
g2->end();
|
|
g2->resizable(NULL);
|
|
win->end();
|
|
win->resizable(tabs);
|
|
win->show(argc,argv);
|
|
#if defined(__APPLE__) || defined(WIN32)
|
|
clip_callback(1, tabs); // use clipboard content at start
|
|
#endif
|
|
Fl::add_clipboard_notify(clip_callback, tabs); // will update with new clipboard content immediately or at application activation
|
|
return Fl::run();
|
|
}
|
|
|
|
//
|
|
// End of "$Id$".
|
|
//
|