Removed small OGL glitches; added new sample
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1640 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
@ -177,13 +177,11 @@ void MyFrame::OnSize(wxSizeEvent& event)
|
||||
|
||||
void MyFrame::OnCloseWindow(wxCloseEvent& event)
|
||||
{
|
||||
if (wxDocParentFrame::OnClose())
|
||||
wxDocParentFrame::OnCloseWindow(event);
|
||||
if (!event.GetVeto())
|
||||
{
|
||||
wxOGLCleanUp();
|
||||
this->Destroy();
|
||||
}
|
||||
else
|
||||
event.Veto();
|
||||
}
|
||||
|
||||
// Intercept menu commands
|
||||
|
BIN
utils/ogl/samples/studio/bitmaps/alignb.bmp
Normal file
After Width: | Height: | Size: 238 B |
24
utils/ogl/samples/studio/bitmaps/alignb.xpm
Normal file
@ -0,0 +1,24 @@
|
||||
/* XPM */
|
||||
static char *alignb_xpm[] = {
|
||||
/* columns rows colors chars-per-pixel */
|
||||
"16 15 3 1",
|
||||
" c None",
|
||||
". c Black",
|
||||
"X c Yellow",
|
||||
/* pixels */
|
||||
" ",
|
||||
" ........",
|
||||
" .XXXXXX.",
|
||||
" .XXXXXX.",
|
||||
" .XXXXXX.",
|
||||
" .XXXXXX.",
|
||||
" .XXXXXX.",
|
||||
" ..... .XXXXXX.",
|
||||
" .XXX. .XXXXXX.",
|
||||
" .XXX. .XXXXXX.",
|
||||
" .XXX. .XXXXXX.",
|
||||
" .XXX. .XXXXXX.",
|
||||
" ..... ........",
|
||||
" ",
|
||||
" "
|
||||
};
|
BIN
utils/ogl/samples/studio/bitmaps/alignl.bmp
Normal file
After Width: | Height: | Size: 238 B |
24
utils/ogl/samples/studio/bitmaps/alignl.xpm
Normal file
@ -0,0 +1,24 @@
|
||||
/* XPM */
|
||||
static char *alignl_xpm[] = {
|
||||
/* columns rows colors chars-per-pixel */
|
||||
"16 15 3 1",
|
||||
" c None",
|
||||
". c Black",
|
||||
"X c Yellow",
|
||||
/* pixels */
|
||||
" ",
|
||||
" ...... ",
|
||||
" .XXXX. ",
|
||||
" .XXXX. ",
|
||||
" .XXXX. ",
|
||||
" ...... ",
|
||||
" ",
|
||||
" ",
|
||||
" ........... ",
|
||||
" .XXXXXXXXX. ",
|
||||
" .XXXXXXXXX. ",
|
||||
" .XXXXXXXXX. ",
|
||||
" .XXXXXXXXX. ",
|
||||
" ........... ",
|
||||
" "
|
||||
};
|
BIN
utils/ogl/samples/studio/bitmaps/alignr.bmp
Normal file
After Width: | Height: | Size: 238 B |
24
utils/ogl/samples/studio/bitmaps/alignr.xpm
Normal file
@ -0,0 +1,24 @@
|
||||
/* XPM */
|
||||
static char *alignr_xpm[] = {
|
||||
/* columns rows colors chars-per-pixel */
|
||||
"16 15 3 1",
|
||||
" c None",
|
||||
". c Black",
|
||||
"X c Yellow",
|
||||
/* pixels */
|
||||
" ",
|
||||
" ...... ",
|
||||
" .XXXX. ",
|
||||
" .XXXX. ",
|
||||
" .XXXX. ",
|
||||
" ...... ",
|
||||
" ",
|
||||
" ",
|
||||
" ........... ",
|
||||
" .XXXXXXXXX. ",
|
||||
" .XXXXXXXXX. ",
|
||||
" .XXXXXXXXX. ",
|
||||
" .XXXXXXXXX. ",
|
||||
" ........... ",
|
||||
" "
|
||||
};
|
BIN
utils/ogl/samples/studio/bitmaps/alignt.bmp
Normal file
After Width: | Height: | Size: 238 B |
24
utils/ogl/samples/studio/bitmaps/alignt.xpm
Normal file
@ -0,0 +1,24 @@
|
||||
/* XPM */
|
||||
static char *alignt_xpm[] = {
|
||||
/* columns rows colors chars-per-pixel */
|
||||
"16 15 3 1",
|
||||
" c None",
|
||||
". c Black",
|
||||
"X c Yellow",
|
||||
/* pixels */
|
||||
" ",
|
||||
" ..... ........",
|
||||
" .XXX. .XXXXXX.",
|
||||
" .XXX. .XXXXXX.",
|
||||
" .XXX. .XXXXXX.",
|
||||
" .XXX. .XXXXXX.",
|
||||
" ..... .XXXXXX.",
|
||||
" .XXXXXX.",
|
||||
" .XXXXXX.",
|
||||
" .XXXXXX.",
|
||||
" .XXXXXX.",
|
||||
" .XXXXXX.",
|
||||
" ........",
|
||||
" ",
|
||||
" "
|
||||
};
|
BIN
utils/ogl/samples/studio/bitmaps/arrow.bmp
Normal file
After Width: | Height: | Size: 382 B |
31
utils/ogl/samples/studio/bitmaps/arrow.xpm
Normal file
@ -0,0 +1,31 @@
|
||||
/* XPM */
|
||||
static char *arrow_xpm[] = {
|
||||
/* width height num_colors chars_per_pixel */
|
||||
" 22 22 2 1",
|
||||
/* colors */
|
||||
". c #000000",
|
||||
"# c #c0c0c0",
|
||||
/* pixels */
|
||||
"######################",
|
||||
"######################",
|
||||
"######################",
|
||||
"######################",
|
||||
"######################",
|
||||
"#######.##############",
|
||||
"#######..#############",
|
||||
"#######...############",
|
||||
"#######....###########",
|
||||
"#######.....##########",
|
||||
"#######......#########",
|
||||
"#######.......########",
|
||||
"#######........#######",
|
||||
"#######.....##########",
|
||||
"#######..#..##########",
|
||||
"#######.###..#########",
|
||||
"###########..#########",
|
||||
"############..########",
|
||||
"############..########",
|
||||
"######################",
|
||||
"######################",
|
||||
"######################"
|
||||
};
|
BIN
utils/ogl/samples/studio/bitmaps/bitmap1.bmp
Normal file
After Width: | Height: | Size: 238 B |
BIN
utils/ogl/samples/studio/bitmaps/bitmap2.bmp
Normal file
After Width: | Height: | Size: 238 B |
BIN
utils/ogl/samples/studio/bitmaps/copy.bmp
Normal file
After Width: | Height: | Size: 238 B |
25
utils/ogl/samples/studio/bitmaps/copy.xpm
Normal file
@ -0,0 +1,25 @@
|
||||
/* XPM */
|
||||
static char *copy_xpm[] = {
|
||||
/* columns rows colors chars-per-pixel */
|
||||
"16 15 4 1",
|
||||
" c None",
|
||||
". c Black",
|
||||
"X c Gray100",
|
||||
"o c #000080",
|
||||
/* pixels */
|
||||
" ",
|
||||
" ...... ",
|
||||
" .XXXX.. ",
|
||||
" .XXXX.X. ",
|
||||
" .X..X.oooooo ",
|
||||
" .XXXXXoXXXXoo ",
|
||||
" .X....oXXXXoXo ",
|
||||
" .XXXXXoX..Xoooo",
|
||||
" .X....oXXXXXXXo",
|
||||
" .XXXXXoX.....Xo",
|
||||
" ......oXXXXXXXo",
|
||||
" oX.....Xo",
|
||||
" oXXXXXXXo",
|
||||
" ooooooooo",
|
||||
" "
|
||||
};
|
BIN
utils/ogl/samples/studio/bitmaps/copysize.bmp
Normal file
After Width: | Height: | Size: 238 B |
24
utils/ogl/samples/studio/bitmaps/copysize.xpm
Normal file
@ -0,0 +1,24 @@
|
||||
/* XPM */
|
||||
static char *copysize_xpm[] = {
|
||||
/* columns rows colors chars-per-pixel */
|
||||
"16 15 3 1",
|
||||
" c None",
|
||||
". c Black",
|
||||
"X c Yellow",
|
||||
/* pixels */
|
||||
" ",
|
||||
".......... ... ",
|
||||
".XXXXXXXX. . ",
|
||||
".XXXXXXXX. . ",
|
||||
".XXXXXXXX. .....",
|
||||
".XXXXXXXX. ... ",
|
||||
".......... . ",
|
||||
" ",
|
||||
" . . . . . . ",
|
||||
" ",
|
||||
" . ...... . ",
|
||||
" .XXXX. ",
|
||||
" . ...... . ",
|
||||
" ",
|
||||
" . . . . . . "
|
||||
};
|
BIN
utils/ogl/samples/studio/bitmaps/cut.bmp
Normal file
After Width: | Height: | Size: 238 B |
24
utils/ogl/samples/studio/bitmaps/cut.xpm
Normal file
@ -0,0 +1,24 @@
|
||||
/* XPM */
|
||||
static char *cut_xpm[] = {
|
||||
/* columns rows colors chars-per-pixel */
|
||||
"16 15 3 1",
|
||||
" c None",
|
||||
". c Black",
|
||||
"X c #000080",
|
||||
/* pixels */
|
||||
" ",
|
||||
" . . ",
|
||||
" . . ",
|
||||
" . . ",
|
||||
" .. .. ",
|
||||
" . . ",
|
||||
" ... ",
|
||||
" . ",
|
||||
" X.X ",
|
||||
" X XXX ",
|
||||
" XXX X X ",
|
||||
" X X X X ",
|
||||
" X X X X ",
|
||||
" X X XX ",
|
||||
" XX "
|
||||
};
|
BIN
utils/ogl/samples/studio/bitmaps/cutpoint.bmp
Normal file
After Width: | Height: | Size: 238 B |
25
utils/ogl/samples/studio/bitmaps/cutpoint.xpm
Normal file
@ -0,0 +1,25 @@
|
||||
/* XPM */
|
||||
static char *cutpoint_xpm[] = {
|
||||
/* width height num_colors chars_per_pixel */
|
||||
" 16 15 3 1",
|
||||
/* colors */
|
||||
". c #000000",
|
||||
"# c #800000",
|
||||
"a c #c0c0c0",
|
||||
/* pixels */
|
||||
"aaaaaaaaaaaaaaaa",
|
||||
"aaaaaaaaaaaaaaaa",
|
||||
"aa#aaaaaaaaa#aaa",
|
||||
"aaa#aaaaaaa#aaaa",
|
||||
"aaaa#aaaaa#aaaaa",
|
||||
"aaaaa#...#aaaaaa",
|
||||
"aaaaaa#.#.aaaaaa",
|
||||
".......#........",
|
||||
"aaaaaa#.#.aaaaaa",
|
||||
"aaaaa#...#aaaaaa",
|
||||
"aaaa#aaaaa#aaaaa",
|
||||
"aaa#aaaaaaa#aaaa",
|
||||
"aa#aaaaaaaaa#aaa",
|
||||
"aaaaaaaaaaaaaaaa",
|
||||
"aaaaaaaaaaaaaaaa"
|
||||
};
|
BIN
utils/ogl/samples/studio/bitmaps/file1.ico
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
utils/ogl/samples/studio/bitmaps/folder1.ico
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
utils/ogl/samples/studio/bitmaps/help.bmp
Normal file
After Width: | Height: | Size: 238 B |
24
utils/ogl/samples/studio/bitmaps/help.xpm
Normal file
@ -0,0 +1,24 @@
|
||||
/* XPM */
|
||||
static char *help_xpm[] = {
|
||||
/* columns rows colors chars-per-pixel */
|
||||
"16 15 3 1",
|
||||
" c None",
|
||||
". c Black",
|
||||
"X c #008080",
|
||||
/* pixels */
|
||||
" ",
|
||||
" ...... ",
|
||||
" .XXXXX.. ",
|
||||
" .XX...XX.. ",
|
||||
" .X.. .X.. ",
|
||||
" .X.. .XX.. ",
|
||||
" .. .XX.. ",
|
||||
" .XX.. ",
|
||||
" .X.. ",
|
||||
" .X.. ",
|
||||
" .X.. ",
|
||||
" .. ",
|
||||
" .XX.. ",
|
||||
" .XX.. ",
|
||||
" ... "
|
||||
};
|
BIN
utils/ogl/samples/studio/bitmaps/helpcs.bmp
Normal file
After Width: | Height: | Size: 238 B |
24
utils/ogl/samples/studio/bitmaps/helpcs.xpm
Normal file
@ -0,0 +1,24 @@
|
||||
/* XPM */
|
||||
static char *helpcs_xpm[] = {
|
||||
/* width height num_colors chars_per_pixel */
|
||||
" 16 15 2 1",
|
||||
/* colors */
|
||||
". c #000000",
|
||||
"# c #c0c0c0",
|
||||
/* pixels */
|
||||
"################",
|
||||
".########.....##",
|
||||
"..######..###..#",
|
||||
"...####..####...",
|
||||
"....###..####...",
|
||||
".....###..###..#",
|
||||
"......######..##",
|
||||
".......####..###",
|
||||
"........##..####",
|
||||
".....#####..####",
|
||||
"..#..###########",
|
||||
".###..####...###",
|
||||
"####..####...###",
|
||||
"#####..#########",
|
||||
"#####..#########"
|
||||
};
|
BIN
utils/ogl/samples/studio/bitmaps/horiz.bmp
Normal file
After Width: | Height: | Size: 238 B |
24
utils/ogl/samples/studio/bitmaps/horiz.xpm
Normal file
@ -0,0 +1,24 @@
|
||||
/* XPM */
|
||||
static char *horiz_xpm[] = {
|
||||
/* columns rows colors chars-per-pixel */
|
||||
"16 15 3 1",
|
||||
" c None",
|
||||
". c Black",
|
||||
"X c Yellow",
|
||||
/* pixels */
|
||||
" ",
|
||||
" ..... ",
|
||||
" .XXX. ",
|
||||
" .XXX. ",
|
||||
" .XXX. ",
|
||||
" ..... ",
|
||||
" ",
|
||||
" ",
|
||||
" ........... ",
|
||||
" .XXXXXXXXX. ",
|
||||
" .XXXXXXXXX. ",
|
||||
" .XXXXXXXXX. ",
|
||||
" .XXXXXXXXX. ",
|
||||
" ........... ",
|
||||
" "
|
||||
};
|
BIN
utils/ogl/samples/studio/bitmaps/linearrow.bmp
Normal file
After Width: | Height: | Size: 238 B |
25
utils/ogl/samples/studio/bitmaps/linearrow.xpm
Normal file
@ -0,0 +1,25 @@
|
||||
/* XPM */
|
||||
static char *linearrow_xpm[] = {
|
||||
/* width height num_colors chars_per_pixel */
|
||||
" 16 15 3 1",
|
||||
/* colors */
|
||||
". c #000000",
|
||||
"# c #800000",
|
||||
"a c #c0c0c0",
|
||||
/* pixels */
|
||||
"aaaaaaaaaaaaaaaa",
|
||||
"aaaaa#aaaaaaaaaa",
|
||||
"aaaaa##aaaaaaaaa",
|
||||
"aaaaa###aaaaaaaa",
|
||||
"aaaaa####aaaaaaa",
|
||||
"aaaaa#####aaaaaa",
|
||||
".....######.....",
|
||||
".....######.....",
|
||||
"aaaaa#####aaaaaa",
|
||||
"aaaaa####aaaaaaa",
|
||||
"aaaaa###aaaaaaaa",
|
||||
"aaaaa##aaaaaaaaa",
|
||||
"aaaaa#aaaaaaaaaa",
|
||||
"aaaaaaaaaaaaaaaa",
|
||||
"aaaaaaaaaaaaaaaa"
|
||||
};
|
BIN
utils/ogl/samples/studio/bitmaps/new.bmp
Normal file
After Width: | Height: | Size: 238 B |
24
utils/ogl/samples/studio/bitmaps/new.xpm
Normal file
@ -0,0 +1,24 @@
|
||||
/* XPM */
|
||||
static char *new_xpm[] = {
|
||||
/* columns rows colors chars-per-pixel */
|
||||
"16 15 3 1",
|
||||
" c None",
|
||||
". c Black",
|
||||
"X c Gray100",
|
||||
/* pixels */
|
||||
" ",
|
||||
" ........ ",
|
||||
" .XXXXXX.. ",
|
||||
" .XXXXXX.X. ",
|
||||
" .XXXXXX.... ",
|
||||
" .XXXXXXXXX. ",
|
||||
" .XXXXXXXXX. ",
|
||||
" .XXXXXXXXX. ",
|
||||
" .XXXXXXXXX. ",
|
||||
" .XXXXXXXXX. ",
|
||||
" .XXXXXXXXX. ",
|
||||
" .XXXXXXXXX. ",
|
||||
" .XXXXXXXXX. ",
|
||||
" ........... ",
|
||||
" "
|
||||
};
|
BIN
utils/ogl/samples/studio/bitmaps/newpoint.bmp
Normal file
After Width: | Height: | Size: 238 B |
25
utils/ogl/samples/studio/bitmaps/newpoint.xpm
Normal file
@ -0,0 +1,25 @@
|
||||
/* XPM */
|
||||
static char *newpoint_xpm[] = {
|
||||
/* width height num_colors chars_per_pixel */
|
||||
" 16 15 3 1",
|
||||
/* colors */
|
||||
". c #000000",
|
||||
"# c #c0c0c0",
|
||||
"a c #ffff00",
|
||||
/* pixels */
|
||||
"#######a########",
|
||||
"###a###a###a####",
|
||||
"####a##a##a#####",
|
||||
"#####a#a#a######",
|
||||
"################",
|
||||
"##aaa#....#aaa##",
|
||||
"######....######",
|
||||
"................",
|
||||
"######....######",
|
||||
"######....######",
|
||||
"################",
|
||||
"################",
|
||||
"################",
|
||||
"################",
|
||||
"################"
|
||||
};
|
BIN
utils/ogl/samples/studio/bitmaps/open.bmp
Normal file
After Width: | Height: | Size: 238 B |
26
utils/ogl/samples/studio/bitmaps/open.xpm
Normal file
@ -0,0 +1,26 @@
|
||||
/* XPM */
|
||||
static char *open_xpm[] = {
|
||||
/* columns rows colors chars-per-pixel */
|
||||
"16 15 5 1",
|
||||
" c None",
|
||||
". c Black",
|
||||
"X c Yellow",
|
||||
"o c Gray100",
|
||||
"O c #bfbf00",
|
||||
/* pixels */
|
||||
" ",
|
||||
" ... ",
|
||||
" . . .",
|
||||
" ..",
|
||||
" ... ...",
|
||||
" .XoX....... ",
|
||||
" .oXoXoXoXo. ",
|
||||
" .XoXoXoXoX. ",
|
||||
" .oXoX..........",
|
||||
" .XoX.OOOOOOOOO.",
|
||||
" .oo.OOOOOOOOO. ",
|
||||
" .X.OOOOOOOOO. ",
|
||||
" ..OOOOOOOOO. ",
|
||||
" ........... ",
|
||||
" "
|
||||
};
|
BIN
utils/ogl/samples/studio/bitmaps/paste.bmp
Normal file
After Width: | Height: | Size: 238 B |
27
utils/ogl/samples/studio/bitmaps/paste.xpm
Normal file
@ -0,0 +1,27 @@
|
||||
/* XPM */
|
||||
static char *paste_xpm[] = {
|
||||
/* columns rows colors chars-per-pixel */
|
||||
"16 15 6 1",
|
||||
" c None",
|
||||
". c Black",
|
||||
"X c Yellow",
|
||||
"o c #808080",
|
||||
"O c #000080",
|
||||
"+ c Gray100",
|
||||
/* pixels */
|
||||
" ",
|
||||
" .... ",
|
||||
" .....XX..... ",
|
||||
".ooo.X..X.ooo. ",
|
||||
".oo. .oo. ",
|
||||
".oo........oo. ",
|
||||
".oooooooooooo. ",
|
||||
".oooooOOOOOOO. ",
|
||||
".oooooO+++++OO ",
|
||||
".oooooO+++++O+O ",
|
||||
".oooooO+OOO+OOO ",
|
||||
".oooooO+++++++O ",
|
||||
".oooooO+OOOOO+O ",
|
||||
" .....O+++++++O ",
|
||||
" OOOOOOOOO "
|
||||
};
|
BIN
utils/ogl/samples/studio/bitmaps/preview.bmp
Normal file
After Width: | Height: | Size: 238 B |
26
utils/ogl/samples/studio/bitmaps/preview.xpm
Normal file
@ -0,0 +1,26 @@
|
||||
/* XPM */
|
||||
static char *preview_xpm[] = {
|
||||
/* columns rows colors chars-per-pixel */
|
||||
"16 15 5 1",
|
||||
" c Black",
|
||||
". c None",
|
||||
"X c Gray100",
|
||||
"o c #808080",
|
||||
"O c Cyan",
|
||||
/* pixels */
|
||||
" .......",
|
||||
" XXXXXXX ......",
|
||||
" XXXXXXX . .....",
|
||||
" XXXXXXX ....",
|
||||
" XXXXXXXXXX ....",
|
||||
" XXXXXXX ....",
|
||||
" XXXXXX o..o ...",
|
||||
" XXXXX oOO.oo ..",
|
||||
" XXXXX .O..o. ..",
|
||||
" XXXXX ....o. ..",
|
||||
" XXXXX o..Ooo ..",
|
||||
" XXXXXX o..o o..",
|
||||
" XXXXXXX o .",
|
||||
" XXXXXXXXXX . ",
|
||||
" .. "
|
||||
};
|
BIN
utils/ogl/samples/studio/bitmaps/print.bmp
Normal file
After Width: | Height: | Size: 238 B |
26
utils/ogl/samples/studio/bitmaps/print.xpm
Normal file
@ -0,0 +1,26 @@
|
||||
/* XPM */
|
||||
static char *print_xpm[] = {
|
||||
/* columns rows colors chars-per-pixel */
|
||||
"16 15 5 1",
|
||||
" c None",
|
||||
". c Black",
|
||||
"X c Gray100",
|
||||
"o c #808000",
|
||||
"O c Yellow",
|
||||
/* pixels */
|
||||
" ",
|
||||
" ......... ",
|
||||
" .XXXXXXXX. ",
|
||||
" .X.....X. ",
|
||||
" .XXXXXXXX. ",
|
||||
" .X.....X.... ",
|
||||
" .XXXXXXXX. . .",
|
||||
" .......... . ..",
|
||||
". . . .",
|
||||
"............. .",
|
||||
". ooo . . ",
|
||||
". OOO ... ",
|
||||
"............. . ",
|
||||
" . . . ",
|
||||
" ........... "
|
||||
};
|
BIN
utils/ogl/samples/studio/bitmaps/redo.bmp
Normal file
After Width: | Height: | Size: 238 B |
25
utils/ogl/samples/studio/bitmaps/redo.xpm
Normal file
@ -0,0 +1,25 @@
|
||||
/* XPM */
|
||||
static char *redo_xpm[] = {
|
||||
/* width height num_colors chars_per_pixel */
|
||||
" 16 15 3 1",
|
||||
/* colors */
|
||||
". c #000080",
|
||||
"# c #c0c0c0",
|
||||
"a c #808080",
|
||||
/* pixels */
|
||||
"################",
|
||||
"################",
|
||||
"################",
|
||||
"################",
|
||||
"###a....########",
|
||||
"##a.####..###.##",
|
||||
"##.#######.#..##",
|
||||
"##.########...##",
|
||||
"##.#######....##",
|
||||
"##a.#####.....##",
|
||||
"###.a###########",
|
||||
"################",
|
||||
"################",
|
||||
"################",
|
||||
"################"
|
||||
};
|
BIN
utils/ogl/samples/studio/bitmaps/save.bmp
Normal file
After Width: | Height: | Size: 238 B |
25
utils/ogl/samples/studio/bitmaps/save.xpm
Normal file
@ -0,0 +1,25 @@
|
||||
/* XPM */
|
||||
static char *save_xpm[] = {
|
||||
/* columns rows colors chars-per-pixel */
|
||||
"16 15 4 1",
|
||||
" c None",
|
||||
". c Black",
|
||||
"X c #808000",
|
||||
"o c #808080",
|
||||
/* pixels */
|
||||
" ",
|
||||
" .............. ",
|
||||
" .X. . . ",
|
||||
" .X. ... ",
|
||||
" .X. .X. ",
|
||||
" .X. .X. ",
|
||||
" .X. .X. ",
|
||||
" .X. .X. ",
|
||||
" .XX........oX. ",
|
||||
" .XXXXXXXXXXXX. ",
|
||||
" .XX.........X. ",
|
||||
" .XX...... .X. ",
|
||||
" .XX...... .X. ",
|
||||
" .XX...... .X. ",
|
||||
" ............. "
|
||||
};
|
BIN
utils/ogl/samples/studio/bitmaps/straight.bmp
Normal file
After Width: | Height: | Size: 238 B |
24
utils/ogl/samples/studio/bitmaps/straight.xpm
Normal file
@ -0,0 +1,24 @@
|
||||
/* XPM */
|
||||
static char *straight_xpm[] = {
|
||||
/* width height num_colors chars_per_pixel */
|
||||
" 16 15 2 1",
|
||||
/* colors */
|
||||
". c #000000",
|
||||
"# c #c0c0c0",
|
||||
/* pixels */
|
||||
"################",
|
||||
".........#######",
|
||||
".........#######",
|
||||
"#######..#######",
|
||||
"#######..#######",
|
||||
"#######..#######",
|
||||
"#######..#######",
|
||||
"#######..#######",
|
||||
"#######..#######",
|
||||
"#######..#######",
|
||||
"#######..#######",
|
||||
"#######..#######",
|
||||
"#######.........",
|
||||
"#######.........",
|
||||
"################"
|
||||
};
|
BIN
utils/ogl/samples/studio/bitmaps/texttool.bmp
Normal file
After Width: | Height: | Size: 382 B |
31
utils/ogl/samples/studio/bitmaps/texttool.xpm
Normal file
@ -0,0 +1,31 @@
|
||||
/* XPM */
|
||||
static char *texttool_xpm[] = {
|
||||
/* width height num_colors chars_per_pixel */
|
||||
" 22 22 2 1",
|
||||
/* colors */
|
||||
". c #000000",
|
||||
"# c #c0c0c0",
|
||||
/* pixels */
|
||||
"######################",
|
||||
"######################",
|
||||
"######################",
|
||||
"######################",
|
||||
"##########..##########",
|
||||
"##########..##########",
|
||||
"#########....#########",
|
||||
"#########....#########",
|
||||
"########.....#########",
|
||||
"########..#...########",
|
||||
"#######..##...########",
|
||||
"#######..###...#######",
|
||||
"######.........#######",
|
||||
"######..####...#######",
|
||||
"######.######...######",
|
||||
"#####..######...######",
|
||||
"####....####......####",
|
||||
"######################",
|
||||
"######################",
|
||||
"######################",
|
||||
"######################",
|
||||
"######################"
|
||||
};
|
BIN
utils/ogl/samples/studio/bitmaps/tick.bmp
Normal file
After Width: | Height: | Size: 220 B |
BIN
utils/ogl/samples/studio/bitmaps/tick.xpm
Normal file
BIN
utils/ogl/samples/studio/bitmaps/toback.bmp
Normal file
After Width: | Height: | Size: 238 B |
25
utils/ogl/samples/studio/bitmaps/toback.xpm
Normal file
@ -0,0 +1,25 @@
|
||||
/* XPM */
|
||||
static char *toback_xpm[] = {
|
||||
/* columns rows colors chars-per-pixel */
|
||||
"16 15 4 1",
|
||||
" c None",
|
||||
". c Black",
|
||||
"X c #808080",
|
||||
"o c Yellow",
|
||||
/* pixels */
|
||||
" ....... ",
|
||||
" .XXXXX. ",
|
||||
" .XXXXX...... ",
|
||||
" .XXXXX.oooo. ",
|
||||
" .XXXXX.oooo. ",
|
||||
" .XXXXX.oooo. ",
|
||||
" .......oooo. ",
|
||||
" .oooo.......",
|
||||
" .oooo.XXXXX.",
|
||||
" .oooo.XXXXX.",
|
||||
" ......XXXXX.",
|
||||
" .XXXXX.",
|
||||
" .XXXXX.",
|
||||
" .......",
|
||||
" "
|
||||
};
|
BIN
utils/ogl/samples/studio/bitmaps/tofront.bmp
Normal file
After Width: | Height: | Size: 238 B |
25
utils/ogl/samples/studio/bitmaps/tofront.xpm
Normal file
@ -0,0 +1,25 @@
|
||||
/* XPM */
|
||||
static char *tofront_xpm[] = {
|
||||
/* columns rows colors chars-per-pixel */
|
||||
"16 15 4 1",
|
||||
" c None",
|
||||
". c Black",
|
||||
"X c #808080",
|
||||
"o c Yellow",
|
||||
/* pixels */
|
||||
" ....... ",
|
||||
" .XXXXX. ",
|
||||
" .XX......... ",
|
||||
" .XX.ooooooo. ",
|
||||
" .XX.ooooooo. ",
|
||||
" .XX.ooooooo. ",
|
||||
" ....ooooooo. ",
|
||||
" .ooooooo....",
|
||||
" .ooooooo.XX.",
|
||||
" .ooooooo.XX.",
|
||||
" .........XX.",
|
||||
" .XXXXX.",
|
||||
" .XXXXX.",
|
||||
" .......",
|
||||
" "
|
||||
};
|
BIN
utils/ogl/samples/studio/bitmaps/undo.bmp
Normal file
After Width: | Height: | Size: 238 B |
25
utils/ogl/samples/studio/bitmaps/undo.xpm
Normal file
@ -0,0 +1,25 @@
|
||||
/* XPM */
|
||||
static char *undo_xpm[] = {
|
||||
/* width height num_colors chars_per_pixel */
|
||||
" 16 15 3 1",
|
||||
/* colors */
|
||||
". c #000080",
|
||||
"# c #c0c0c0",
|
||||
"a c #808080",
|
||||
/* pixels */
|
||||
"################",
|
||||
"################",
|
||||
"################",
|
||||
"################",
|
||||
"########....a###",
|
||||
"##.###..####.a##",
|
||||
"##..#.#######.##",
|
||||
"##...########.##",
|
||||
"##....#######.##",
|
||||
"##.....#####.a##",
|
||||
"###########a.###",
|
||||
"################",
|
||||
"################",
|
||||
"################",
|
||||
"################"
|
||||
};
|
BIN
utils/ogl/samples/studio/bitmaps/vert.bmp
Normal file
After Width: | Height: | Size: 238 B |
24
utils/ogl/samples/studio/bitmaps/vert.xpm
Normal file
@ -0,0 +1,24 @@
|
||||
/* XPM */
|
||||
static char *vert_xpm[] = {
|
||||
/* columns rows colors chars-per-pixel */
|
||||
"16 15 3 1",
|
||||
" c None",
|
||||
". c Black",
|
||||
"X c Yellow",
|
||||
/* pixels */
|
||||
" ",
|
||||
" ........",
|
||||
" .XXXXXX.",
|
||||
" .XXXXXX.",
|
||||
" ..... .XXXXXX.",
|
||||
" .XXX. .XXXXXX.",
|
||||
" .XXX. .XXXXXX.",
|
||||
" .XXX. .XXXXXX.",
|
||||
" .XXX. .XXXXXX.",
|
||||
" ..... .XXXXXX.",
|
||||
" .XXXXXX.",
|
||||
" .XXXXXX.",
|
||||
" ........",
|
||||
" ",
|
||||
" "
|
||||
};
|
153
utils/ogl/samples/studio/cspalette.cpp
Normal file
@ -0,0 +1,153 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: cspalette.cpp
|
||||
// Purpose: OGLEdit palette
|
||||
// Author: Julian Smart
|
||||
// Modified by:
|
||||
// Created: 12/07/98
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) Julian Smart
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __GNUG__
|
||||
// #pragma implementation
|
||||
#endif
|
||||
|
||||
// For compilers that support precompilation, includes "wx.h".
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
#include <wx/laywin.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "doc.h"
|
||||
#include "view.h"
|
||||
#include "studio.h"
|
||||
#include "cspalette.h"
|
||||
#include "symbols.h"
|
||||
|
||||
#if defined(__WXGTK__) || defined(__WXMOTIF__)
|
||||
#include "bitmaps/arrow.xpm"
|
||||
#include "bitmaps/texttool.xpm"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Object editor tool palette
|
||||
*
|
||||
*/
|
||||
|
||||
csEditorToolPalette::csEditorToolPalette(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size,
|
||||
long style):
|
||||
TOOLPALETTECLASS(parent, id, pos, size, style)
|
||||
{
|
||||
m_currentlySelected = -1;
|
||||
|
||||
SetMaxRowsCols(1, 1000);
|
||||
}
|
||||
|
||||
bool csEditorToolPalette::OnLeftClick(int toolIndex, bool toggled)
|
||||
{
|
||||
// BEGIN mutual exclusivity code
|
||||
if (toggled && (m_currentlySelected != -1) && (toolIndex != m_currentlySelected))
|
||||
ToggleTool(m_currentlySelected, FALSE);
|
||||
|
||||
if (toggled)
|
||||
m_currentlySelected = toolIndex;
|
||||
else if (m_currentlySelected == toolIndex)
|
||||
m_currentlySelected = -1;
|
||||
// END mutual exclusivity code
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void csEditorToolPalette::OnMouseEnter(int toolIndex)
|
||||
{
|
||||
wxString msg("");
|
||||
if (toolIndex == PALETTE_ARROW)
|
||||
msg = "Pointer";
|
||||
else if (toolIndex != -1)
|
||||
{
|
||||
csSymbol* symbol = wxGetApp().GetSymbolDatabase()->FindSymbol(toolIndex);
|
||||
if (symbol)
|
||||
msg = symbol->GetName();
|
||||
}
|
||||
((wxFrame*) wxGetApp().GetTopWindow())->SetStatusText(msg);
|
||||
}
|
||||
|
||||
void csEditorToolPalette::SetSize(int x, int y, int width, int height, int sizeFlags)
|
||||
{
|
||||
TOOLPALETTECLASS::SetSize(x, y, width, height, sizeFlags);
|
||||
}
|
||||
|
||||
void csEditorToolPalette::SetSelection(int sel)
|
||||
{
|
||||
if ((sel != m_currentlySelected) && (m_currentlySelected != -1))
|
||||
{
|
||||
ToggleTool(m_currentlySelected, FALSE);
|
||||
}
|
||||
m_currentlySelected = sel;
|
||||
ToggleTool(m_currentlySelected, TRUE);
|
||||
}
|
||||
|
||||
bool csApp::CreatePalette(wxFrame *parent)
|
||||
{
|
||||
// First create a layout window
|
||||
wxSashLayoutWindow* win = new wxSashLayoutWindow(parent, ID_LAYOUT_WINDOW_PALETTE, wxDefaultPosition, wxSize(200, 30), wxNO_BORDER|wxSW_3D|wxCLIP_CHILDREN);
|
||||
win->SetDefaultSize(wxSize(10000, 40));
|
||||
win->SetOrientation(wxLAYOUT_HORIZONTAL);
|
||||
win->SetAlignment(wxLAYOUT_TOP);
|
||||
win->SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
|
||||
win->SetSashVisible(wxSASH_BOTTOM, TRUE);
|
||||
|
||||
m_diagramPaletteSashWindow = win;
|
||||
|
||||
m_diagramPaletteSashWindow->Show(FALSE);
|
||||
|
||||
// Load palette bitmaps
|
||||
#ifdef __WXMSW__
|
||||
wxBitmap PaletteArrow("arrowtool");
|
||||
wxBitmap TextTool("texttool");
|
||||
#elif defined(__WXGTK__) || defined(__WXMOTIF__)
|
||||
wxBitmap PaletteArrow(arrow_xpm);
|
||||
wxBitmap TextTool(texttool_xpm);
|
||||
#endif
|
||||
|
||||
csEditorToolPalette *palette = new csEditorToolPalette(m_diagramPaletteSashWindow, ID_DIAGRAM_PALETTE, wxPoint(0, 0), wxSize(-1, -1), wxTB_HORIZONTAL|wxNO_BORDER);
|
||||
|
||||
palette->SetMargins(2, 2);
|
||||
|
||||
palette->SetToolBitmapSize(wxSize(32, 32));
|
||||
|
||||
palette->AddTool(PALETTE_ARROW, PaletteArrow, wxNullBitmap, TRUE, 0, -1, NULL, "Pointer");
|
||||
palette->AddTool(PALETTE_TEXT_TOOL, TextTool, wxNullBitmap, TRUE, 0, -1, NULL, "Text");
|
||||
|
||||
wxNode* node = GetSymbolDatabase()->GetSymbols().First();
|
||||
while (node)
|
||||
{
|
||||
csSymbol* symbol = (csSymbol*) node->Data();
|
||||
wxBitmap* bitmap = GetSymbolDatabase()->CreateToolBitmap(symbol);
|
||||
palette->AddTool(symbol->GetToolId(), *bitmap, wxNullBitmap, TRUE, 0, -1, NULL, symbol->GetName());
|
||||
|
||||
delete bitmap;
|
||||
|
||||
node = node->Next();
|
||||
}
|
||||
|
||||
palette->Realize();
|
||||
|
||||
palette->SetSelection(PALETTE_ARROW);
|
||||
m_diagramPalette = palette;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
57
utils/ogl/samples/studio/cspalette.h
Normal file
@ -0,0 +1,57 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: cspalette.h
|
||||
// Purpose: OGL sample palette
|
||||
// Author: Julian Smart
|
||||
// Modified by:
|
||||
// Created: 12/07/98
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) Julian Smart
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _STUDIO_CSPALETTE_H_
|
||||
#define _STUDIO_CSPALETTE_H_
|
||||
|
||||
#ifdef __GNUG__
|
||||
// #pragma interface
|
||||
#endif
|
||||
|
||||
#include <wx/wx.h>
|
||||
#include <wx/string.h>
|
||||
#include <wx/tbarsmpl.h>
|
||||
|
||||
/*
|
||||
* Object editor tool palette
|
||||
*
|
||||
*/
|
||||
|
||||
// TODO for wxWin: wxToolBar95 cannot be moved to a non-0,0 position!
|
||||
// Needs to have a parent window...
|
||||
// So use a simple toolbar at present.
|
||||
#define TOOLPALETTECLASS wxToolBarSimple
|
||||
|
||||
class csEditorToolPalette: public TOOLPALETTECLASS
|
||||
{
|
||||
public:
|
||||
|
||||
csEditorToolPalette(wxWindow *parent, wxWindowID id = -1, const wxPoint& pos = wxDefaultPosition,
|
||||
const wxSize& size = wxDefaultSize,
|
||||
long style = wxTB_VERTICAL);
|
||||
|
||||
bool OnLeftClick(int toolIndex, bool toggled);
|
||||
void OnMouseEnter(int toolIndex);
|
||||
|
||||
inline int GetSelection() const { return m_currentlySelected; }
|
||||
void SetSelection(int sel);
|
||||
|
||||
void SetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO);
|
||||
|
||||
protected:
|
||||
int m_currentlySelected;
|
||||
};
|
||||
|
||||
#define PALETTE_ARROW 200
|
||||
#define PALETTE_TEXT_TOOL 201
|
||||
|
||||
#endif
|
||||
// _STUDIO_CSPALETTE_H_
|
318
utils/ogl/samples/studio/csprint.cpp
Normal file
@ -0,0 +1,318 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: csprint.cpp
|
||||
// Purpose: Printing and clipboard functionality
|
||||
// Author: Julian Smart
|
||||
// Modified by:
|
||||
// Created: 12/07/98
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) Julian Smart
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __GNUG__
|
||||
// #pragma implementation
|
||||
#endif
|
||||
|
||||
// For compilers that support precompilation, includes "wx.h".
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
#include <wx/wxexpr.h>
|
||||
#include <wx/clipbrd.h>
|
||||
|
||||
#ifdef __WXMSW__
|
||||
#include <wx/metafile.h>
|
||||
#endif
|
||||
|
||||
#include "studio.h"
|
||||
#include "doc.h"
|
||||
#include "shapes.h"
|
||||
#include "view.h"
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxDiagramClipboard, wxDiagram)
|
||||
|
||||
// Copy selection
|
||||
bool wxDiagramClipboard::Copy(wxDiagram* diagram)
|
||||
{
|
||||
DeleteAllShapes();
|
||||
|
||||
return DoCopy(diagram, this, FALSE, NULL);
|
||||
}
|
||||
|
||||
// Copy contents to the diagram, with new ids.
|
||||
|
||||
bool wxDiagramClipboard::Paste(wxDiagram* diagram, wxDC* dc, int offsetX, int offsetY)
|
||||
{
|
||||
return DoCopy(this, diagram, TRUE, dc, offsetX, offsetY);
|
||||
}
|
||||
|
||||
// Universal copy function (to or from clipboard).
|
||||
// TODO:
|
||||
// Note that this only works for non-composites so far (nested shapes
|
||||
// don't have their old-to-new object mappings stored).
|
||||
// Also, lines don't yet get their attachment points moved to the new offset position
|
||||
// if they have more than 2 points.
|
||||
bool wxDiagramClipboard::DoCopy(wxDiagram* diagramFrom, wxDiagram* diagramTo, bool newIds,
|
||||
wxDC* dc, int offsetX, int offsetY)
|
||||
{
|
||||
OnStartCopy(diagramTo);
|
||||
|
||||
wxHashTable mapping(wxKEY_INTEGER);
|
||||
|
||||
// First copy all node shapes.
|
||||
wxList* shapeList = diagramFrom->GetShapeList();
|
||||
wxNode* node = shapeList->First();
|
||||
while (node)
|
||||
{
|
||||
wxShape* shape = (wxShape*) node->Data();
|
||||
if (((diagramFrom == this) || shape->Selected()) && !shape->IsKindOf(CLASSINFO(wxLineShape)))
|
||||
{
|
||||
wxShape* newShape = shape->CreateNewCopy();
|
||||
newShape->GetLines().Clear();
|
||||
if (newIds)
|
||||
{
|
||||
newShape->AssignNewIds();
|
||||
}
|
||||
mapping.Put((long) shape, (wxObject*) newShape);
|
||||
|
||||
newShape->SetX(newShape->GetX() + offsetX);
|
||||
newShape->SetY(newShape->GetY() + offsetY);
|
||||
|
||||
OnAddShape(diagramTo, newShape, dc);
|
||||
|
||||
}
|
||||
node = node->Next();
|
||||
}
|
||||
|
||||
node = shapeList->First();
|
||||
while (node)
|
||||
{
|
||||
wxShape* shape = (wxShape*) node->Data();
|
||||
if (((diagramFrom == this) || shape->Selected()) && shape->IsKindOf(CLASSINFO(wxLineShape)))
|
||||
{
|
||||
wxLineShape* lineShape = (wxLineShape*) shape;
|
||||
// Only copy a line if its ends are selected too.
|
||||
if ((diagramFrom == this) || (lineShape->GetTo()->Selected() && lineShape->GetFrom()->Selected()))
|
||||
{
|
||||
wxLineShape* newShape = (wxLineShape*) shape->CreateNewCopy();
|
||||
mapping.Put((long) shape, (wxObject*) newShape);
|
||||
|
||||
if (newIds)
|
||||
newShape->AssignNewIds();
|
||||
|
||||
wxShape* fromShape = (wxShape*) mapping.Get((long) lineShape->GetFrom());
|
||||
wxShape* toShape = (wxShape*) mapping.Get((long) lineShape->GetTo());
|
||||
|
||||
wxASSERT_MSG( (fromShape != NULL), "Could not find 'from' shape");
|
||||
wxASSERT_MSG( (toShape != NULL), "Could not find 'to' shape");
|
||||
|
||||
fromShape->AddLine(newShape, toShape, newShape->GetAttachmentFrom(),
|
||||
newShape->GetAttachmentTo());
|
||||
|
||||
OnAddShape(diagramTo, newShape, dc);
|
||||
|
||||
}
|
||||
}
|
||||
node = node->Next();
|
||||
}
|
||||
|
||||
// Now make sure line ordering is correct
|
||||
node = shapeList->First();
|
||||
while (node)
|
||||
{
|
||||
wxShape* shape = (wxShape*) node->Data();
|
||||
if (((diagramFrom == this) || shape->Selected()) && !shape->IsKindOf(CLASSINFO(wxLineShape)))
|
||||
{
|
||||
wxShape* newShape = (wxShape*) mapping.Get((long) shape);
|
||||
|
||||
// Make a list of all the new lines, in the same order as the old lines.
|
||||
// Then apply the list of new lines to the shape.
|
||||
wxList newLines;
|
||||
wxNode* lineNode = shape->GetLines().First();
|
||||
while (lineNode)
|
||||
{
|
||||
wxLineShape* lineShape = (wxLineShape*) lineNode->Data();
|
||||
if ((diagramFrom == this) || (lineShape->GetTo()->Selected() && lineShape->GetFrom()->Selected()))
|
||||
{
|
||||
wxLineShape* newLineShape = (wxLineShape*) mapping.Get((long) lineShape);
|
||||
|
||||
wxASSERT_MSG( (newLineShape != NULL), "Could not find new line shape");
|
||||
|
||||
newLines.Append(newLineShape);
|
||||
}
|
||||
|
||||
lineNode = lineNode->Next();
|
||||
}
|
||||
|
||||
if (newLines.Number() > 0)
|
||||
newShape->ApplyAttachmentOrdering(newLines);
|
||||
}
|
||||
node = node->Next();
|
||||
}
|
||||
|
||||
OnEndCopy(diagramTo);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#ifdef __WXMSW__
|
||||
// Draw contents to a Windows metafile device context and a bitmap, and copy
|
||||
// these to the Windows clipboard
|
||||
bool wxDiagramClipboard::CopyToClipboard(double scale)
|
||||
{
|
||||
// Make a metafile DC
|
||||
wxMetaFileDC mfDC;
|
||||
if (mfDC.Ok())
|
||||
{
|
||||
mfDC.SetUserScale(scale, scale);
|
||||
|
||||
// Draw on metafile DC
|
||||
Redraw(mfDC);
|
||||
|
||||
int printWidth = mfDC.MaxX() - mfDC.MinX();
|
||||
int printHeight = mfDC.MaxY() - mfDC.MinY();
|
||||
int maxX = (int)mfDC.MaxX();
|
||||
int maxY = (int)mfDC.MaxY();
|
||||
wxMetaFile *mf = mfDC.Close();
|
||||
|
||||
// Set to a bitmap memory DC
|
||||
wxBitmap *newBitmap = new wxBitmap((int)(maxX + 10), (int)(maxY + 10));
|
||||
if (!newBitmap->Ok())
|
||||
{
|
||||
delete newBitmap;
|
||||
|
||||
char buf[200];
|
||||
sprintf(buf, "Sorry, could not allocate clipboard bitmap (%dx%d)", (maxX+10), (maxY+10));
|
||||
wxMessageBox(buf, "Clipboard copy problem");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
wxMemoryDC memDC;
|
||||
memDC.SelectObject(*newBitmap);
|
||||
memDC.Clear();
|
||||
|
||||
// Now draw on memory bitmap DC
|
||||
Redraw(memDC);
|
||||
|
||||
memDC.SelectObject(wxNullBitmap);
|
||||
|
||||
// Open clipboard and set the data
|
||||
if (wxOpenClipboard())
|
||||
{
|
||||
wxEmptyClipboard();
|
||||
|
||||
// Copy the bitmap to the clipboard
|
||||
wxSetClipboardData(wxDF_BITMAP, newBitmap, 0, 0);
|
||||
|
||||
if (mf)
|
||||
{
|
||||
// Copy the metafile to the clipboard
|
||||
// Allow a small margin
|
||||
bool success = mf->SetClipboard((int)(mfDC.MaxX() + 15), (int)(mfDC.MaxY() + 15));
|
||||
}
|
||||
|
||||
// Close clipboard
|
||||
wxCloseClipboard();
|
||||
}
|
||||
|
||||
delete newBitmap;
|
||||
delete mf;
|
||||
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
#endif
|
||||
// __WXMSW__
|
||||
|
||||
// Override this to e.g. have the shape added through a Do/Undo command system.
|
||||
// By default, we'll just add it directly to the destination diagram.
|
||||
bool wxDiagramClipboard::OnAddShape(wxDiagram* diagramTo, wxShape* newShape, wxDC* dc)
|
||||
{
|
||||
diagramTo->AddShape(newShape);
|
||||
|
||||
if (dc && (diagramTo != this))
|
||||
{
|
||||
newShape->Select(TRUE, dc);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
* csDiagramClipboard
|
||||
*/
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(csDiagramClipboard, wxDiagramClipboard)
|
||||
|
||||
// Start/end copying
|
||||
bool csDiagramClipboard::OnStartCopy(wxDiagram* diagramTo)
|
||||
{
|
||||
// Do nothing if copying to the clipboard
|
||||
if (diagramTo == this)
|
||||
return TRUE;
|
||||
|
||||
// Deselect all objects initially.
|
||||
|
||||
csDiagram* diagram = (csDiagram*) diagramTo;
|
||||
csDiagramDocument* doc = diagram->GetDocument();
|
||||
((csDiagramView*)doc->GetFirstView())->SelectAll(FALSE);
|
||||
|
||||
m_currentCmd = new csDiagramCommand("Paste", doc);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool csDiagramClipboard::OnEndCopy(wxDiagram* diagramTo)
|
||||
{
|
||||
// Do nothing if copying to the clipboard
|
||||
if (diagramTo == this)
|
||||
return TRUE;
|
||||
|
||||
csDiagram* diagram = (csDiagram*) diagramTo;
|
||||
csDiagramDocument* doc = diagram->GetDocument();
|
||||
|
||||
if (m_currentCmd)
|
||||
{
|
||||
if (m_currentCmd->GetStates().Number() == 0)
|
||||
{
|
||||
delete m_currentCmd;
|
||||
}
|
||||
else
|
||||
{
|
||||
doc->GetCommandProcessor()->Submit(m_currentCmd);
|
||||
m_currentCmd = NULL;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// Use the command framework to add the shapes, if we're copying to a diagram and
|
||||
// not the clipboard.
|
||||
bool csDiagramClipboard::OnAddShape(wxDiagram* diagramTo, wxShape* newShape, wxDC* dc)
|
||||
{
|
||||
if (diagramTo == this)
|
||||
{
|
||||
diagramTo->AddShape(newShape);
|
||||
}
|
||||
else
|
||||
{
|
||||
csDiagram* diagram = (csDiagram*) diagramTo;
|
||||
csDiagramDocument* doc = diagram->GetDocument();
|
||||
|
||||
if (newShape->IsKindOf(CLASSINFO(wxLineShape)))
|
||||
m_currentCmd->AddState(new csCommandState(ID_CS_ADD_LINE_SELECT, newShape, NULL));
|
||||
else
|
||||
m_currentCmd->AddState(new csCommandState(ID_CS_ADD_SHAPE_SELECT, newShape, NULL));
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
525
utils/ogl/samples/studio/dialogs.cpp
Normal file
@ -0,0 +1,525 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: dialogs.cpp
|
||||
// Purpose: Implements Studio dialogs
|
||||
// Author: Julian Smart
|
||||
// Modified by:
|
||||
// Created: 12/07/98
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) Julian Smart
|
||||
// Licence:
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __GNUG__
|
||||
// #pragma implementation
|
||||
#endif
|
||||
|
||||
// For compilers that support precompilation, includes "wx.h".
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
#include <wx/resource.h>
|
||||
#include "dialogs.h"
|
||||
#include "doc.h"
|
||||
#include "view.h"
|
||||
#include "studio.h"
|
||||
#include "studio_resources.h"
|
||||
|
||||
IMPLEMENT_CLASS(csLabelEditingDialog, wxDialog)
|
||||
|
||||
BEGIN_EVENT_TABLE(csLabelEditingDialog, wxDialog)
|
||||
EVT_BUTTON(wxID_OK, csLabelEditingDialog::OnOK)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
csLabelEditingDialog::csLabelEditingDialog(wxWindow* parent)
|
||||
{
|
||||
LoadFromResource(parent, "shape_label_dialog");
|
||||
|
||||
// Accelerators
|
||||
wxAcceleratorEntry entries[1];
|
||||
entries[0].Set(wxACCEL_CTRL, WXK_RETURN, wxID_OK);
|
||||
wxAcceleratorTable accel(1, entries);
|
||||
SetAcceleratorTable(accel);
|
||||
|
||||
Centre();
|
||||
|
||||
wxTextCtrl* textCtrl = (wxTextCtrl*) FindWindow(ID_LABELTEXT);
|
||||
wxASSERT( (textCtrl != NULL) );
|
||||
|
||||
// textCtrl->SetAcceleratorTable(accel);
|
||||
|
||||
textCtrl->SetFocus();
|
||||
}
|
||||
|
||||
void csLabelEditingDialog::OnOK(wxCommandEvent& event)
|
||||
{
|
||||
wxTextCtrl* textCtrl = (wxTextCtrl*) FindWindow(ID_LABELTEXT);
|
||||
wxASSERT( (textCtrl != NULL) );
|
||||
|
||||
SetShapeLabel(textCtrl->GetValue());
|
||||
|
||||
wxDialog::OnOK(event);
|
||||
}
|
||||
|
||||
void csLabelEditingDialog::SetShapeLabel(const wxString& label)
|
||||
{
|
||||
wxTextCtrl* textCtrl = (wxTextCtrl*) FindWindow(ID_LABELTEXT);
|
||||
wxASSERT( (textCtrl != NULL) );
|
||||
|
||||
m_label = label;
|
||||
|
||||
textCtrl->SetValue(label);
|
||||
}
|
||||
|
||||
IMPLEMENT_CLASS(csSettingsDialog, wxDialog)
|
||||
|
||||
BEGIN_EVENT_TABLE(csSettingsDialog, wxDialog)
|
||||
EVT_BUTTON(wxID_OK, csSettingsDialog::OnOK)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
#define PROPERTY_DIALOG_WIDTH 400
|
||||
#define PROPERTY_DIALOG_HEIGHT 400
|
||||
|
||||
// For 400x400 settings dialog, size your panels to about 375x325 in dialog editor
|
||||
|
||||
csSettingsDialog::csSettingsDialog(wxWindow* parent):
|
||||
wxDialog(parent, -1, "Settings", wxPoint(0, 0), wxSize(PROPERTY_DIALOG_WIDTH, PROPERTY_DIALOG_HEIGHT))
|
||||
{
|
||||
m_generalSettings = NULL;
|
||||
m_diagramSettings = NULL;
|
||||
|
||||
m_notebook = new wxNotebook(this, ID_PROPERTY_NOTEBOOK,
|
||||
wxPoint(2, 2), wxSize(PROPERTY_DIALOG_WIDTH - 4, PROPERTY_DIALOG_HEIGHT - 4));
|
||||
|
||||
m_generalSettings = new wxPanel;
|
||||
|
||||
bool success = m_generalSettings->LoadFromResource(m_notebook, "general_settings_dialog");
|
||||
wxASSERT_MSG( (success), "Could not load general settings panel.");
|
||||
m_notebook->AddPage(m_generalSettings, "General", TRUE);
|
||||
|
||||
m_diagramSettings = new wxPanel;
|
||||
|
||||
success = m_diagramSettings->LoadFromResource(m_notebook, "diagram_settings_dialog");
|
||||
wxASSERT_MSG( (success), "Could not load diagram settings panel.");
|
||||
m_notebook->AddPage(m_diagramSettings, "Diagram");
|
||||
|
||||
int largeButtonWidth = 70;
|
||||
int largeButtonHeight = 22;
|
||||
|
||||
wxButton* okButton = new wxButton(this, wxID_OK, "OK", wxPoint(0, 0), wxSize(largeButtonWidth, largeButtonHeight));
|
||||
wxButton* cancelButton = new wxButton(this, wxID_CANCEL, "Cancel", wxPoint(0, 0), wxSize(largeButtonWidth, largeButtonHeight));
|
||||
wxButton* helpButton = new wxButton(this, wxID_HELP, "Help", wxPoint(0, 0), wxSize(largeButtonWidth, largeButtonHeight));
|
||||
|
||||
// Constraints for the notebook
|
||||
wxLayoutConstraints *c = new wxLayoutConstraints;
|
||||
c->top.SameAs (this, wxTop, 5);
|
||||
c->left.SameAs (this, wxLeft, 5);
|
||||
c->right.SameAs (this, wxRight, 5);
|
||||
c->bottom.SameAs (cancelButton, wxTop, 5);
|
||||
m_notebook->SetConstraints(c);
|
||||
|
||||
// Constraints for the Help button
|
||||
c = new wxLayoutConstraints;
|
||||
c->width.AsIs();
|
||||
c->height.AsIs();
|
||||
c->right.SameAs (this, wxRight, 5);
|
||||
c->bottom.SameAs (this, wxBottom, 5);
|
||||
helpButton->SetConstraints(c);
|
||||
|
||||
// Constraints for the Cancel button
|
||||
c = new wxLayoutConstraints;
|
||||
c->width.AsIs();
|
||||
c->height.AsIs();
|
||||
c->right.SameAs (helpButton, wxLeft, 5);
|
||||
c->bottom.SameAs (this, wxBottom, 5);
|
||||
cancelButton->SetConstraints(c);
|
||||
|
||||
// Constraints for the OK button
|
||||
c = new wxLayoutConstraints;
|
||||
c->width.AsIs();
|
||||
c->height.AsIs();
|
||||
c->right.SameAs (cancelButton, wxLeft, 5);
|
||||
c->bottom.SameAs (this, wxBottom, 5);
|
||||
okButton->SetConstraints(c);
|
||||
|
||||
okButton->SetDefault();
|
||||
okButton->SetFocus();
|
||||
|
||||
Layout();
|
||||
Centre(wxBOTH);
|
||||
}
|
||||
|
||||
void csSettingsDialog::OnOK(wxCommandEvent& event)
|
||||
{
|
||||
wxDialog::OnOK(event);
|
||||
}
|
||||
|
||||
bool csSettingsDialog::TransferDataToWindow()
|
||||
{
|
||||
wxTextCtrl* gridSpacing = (wxTextCtrl*) m_diagramSettings->FindWindow(ID_GRID_SPACING);
|
||||
wxASSERT_MSG( (gridSpacing != (wxTextCtrl*) NULL), "Could not find grid spacing control.");
|
||||
|
||||
wxChoice* gridStyle = (wxChoice*) m_diagramSettings->FindWindow(ID_GRID_STYLE);
|
||||
wxASSERT_MSG( (gridStyle != (wxChoice*) NULL), "Could not find grid style control.");
|
||||
|
||||
gridStyle->SetSelection(wxGetApp().GetGridStyle());
|
||||
|
||||
wxString str;
|
||||
str.Printf("%d", wxGetApp().GetGridSpacing());
|
||||
gridSpacing->SetValue(str);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool csSettingsDialog::TransferDataFromWindow()
|
||||
{
|
||||
wxTextCtrl* gridSpacing = (wxTextCtrl*) m_diagramSettings->FindWindow(ID_GRID_SPACING);
|
||||
wxASSERT_MSG( (gridSpacing != (wxTextCtrl*) NULL), "Could not find grid spacing control.");
|
||||
|
||||
wxChoice* gridStyle = (wxChoice*) m_diagramSettings->FindWindow(ID_GRID_STYLE);
|
||||
wxASSERT_MSG( (gridStyle != (wxChoice*) NULL), "Could not find grid style control.");
|
||||
|
||||
wxGetApp().SetGridStyle(gridStyle->GetSelection());
|
||||
wxGetApp().SetGridSpacing(atoi(gridSpacing->GetValue()));
|
||||
|
||||
if (wxGetApp().GetGridStyle() == csGRID_STYLE_DOTTED)
|
||||
{
|
||||
wxMessageBox("Dotted grid style not yet implemented.", "Studio", wxICON_EXCLAMATION);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Apply settings to all open diagram documents
|
||||
wxNode* node = wxGetApp().GetDocManager()->GetDocuments().First();
|
||||
while (node)
|
||||
{
|
||||
wxDocument* doc = (wxDocument*) node->Data();
|
||||
if (doc->IsKindOf(CLASSINFO(csDiagramDocument)))
|
||||
{
|
||||
csDiagramDocument* diagramDoc = (csDiagramDocument*) doc;
|
||||
wxDiagram* diagram = (wxDiagram*) diagramDoc->GetDiagram();
|
||||
|
||||
diagram->SetGridSpacing((double) wxGetApp().GetGridSpacing());
|
||||
switch (wxGetApp().GetGridStyle())
|
||||
{
|
||||
case csGRID_STYLE_NONE:
|
||||
{
|
||||
diagram->SetSnapToGrid(FALSE);
|
||||
break;
|
||||
}
|
||||
case csGRID_STYLE_INVISIBLE:
|
||||
{
|
||||
diagram->SetSnapToGrid(TRUE);
|
||||
break;
|
||||
}
|
||||
case csGRID_STYLE_DOTTED:
|
||||
{
|
||||
// TODO (not implemented in OGL)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
node = node->Next();
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Shape properties dialog (tabbed)
|
||||
*/
|
||||
|
||||
|
||||
IMPLEMENT_CLASS(csShapePropertiesDialog, wxDialog)
|
||||
|
||||
BEGIN_EVENT_TABLE(csShapePropertiesDialog, wxDialog)
|
||||
EVT_BUTTON(wxID_OK, csShapePropertiesDialog::OnOK)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
#define SHAPE_PROPERTY_DIALOG_WIDTH 400
|
||||
#define SHAPE_PROPERTY_DIALOG_HEIGHT 400
|
||||
|
||||
// For 400x400 settings dialog, size your panels to about 375x325 in dialog editor
|
||||
|
||||
csShapePropertiesDialog::csShapePropertiesDialog(wxWindow* parent, const wxString& title,
|
||||
wxPanel* attributeDialog, const wxString& attributeDialogName):
|
||||
wxDialog(parent, -1, title, wxPoint(0, 0), wxSize(SHAPE_PROPERTY_DIALOG_WIDTH, SHAPE_PROPERTY_DIALOG_HEIGHT))
|
||||
{
|
||||
m_attributeDialog = attributeDialog;
|
||||
m_alternativeAttributeDialog = NULL;
|
||||
m_generalPropertiesDialog = NULL;
|
||||
|
||||
m_notebook = new wxNotebook(this, ID_SHAPE_PROPERTY_NOTEBOOK,
|
||||
wxPoint(2, 2), wxSize(SHAPE_PROPERTY_DIALOG_WIDTH - 4, SHAPE_PROPERTY_DIALOG_HEIGHT - 4));
|
||||
|
||||
m_generalPropertiesDialog = new csGeneralShapePropertiesDialog;
|
||||
bool success = m_generalPropertiesDialog->LoadFromResource(m_notebook, "general_shape_properties_dialog");
|
||||
wxASSERT_MSG( (success), "Could not load general properties panel.");
|
||||
m_notebook->AddPage(m_generalPropertiesDialog, "General");
|
||||
|
||||
success = m_attributeDialog->LoadFromResource(m_notebook, attributeDialogName);
|
||||
if (!success)
|
||||
{
|
||||
wxMessageBox("Could not load the attribute dialog for this shape.", "Studio", wxICON_EXCLAMATION);
|
||||
delete m_attributeDialog;
|
||||
m_attributeDialog = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_notebook->AddPage(m_attributeDialog, "Attributes");
|
||||
}
|
||||
|
||||
// Try the alternative dialog (test code)
|
||||
wxString str(attributeDialogName);
|
||||
str += "1";
|
||||
m_alternativeAttributeDialog = new wxPanel;
|
||||
success = m_alternativeAttributeDialog->LoadFromResource(m_notebook, str);
|
||||
if (success)
|
||||
{
|
||||
m_notebook->AddPage(m_alternativeAttributeDialog, "Attributes (alternative)");
|
||||
}
|
||||
else
|
||||
{
|
||||
delete m_alternativeAttributeDialog;
|
||||
m_alternativeAttributeDialog = NULL;
|
||||
}
|
||||
|
||||
int largeButtonWidth = 70;
|
||||
int largeButtonHeight = 22;
|
||||
|
||||
wxButton* okButton = new wxButton(this, wxID_OK, "OK", wxPoint(0, 0), wxSize(largeButtonWidth, largeButtonHeight));
|
||||
wxButton* cancelButton = new wxButton(this, wxID_CANCEL, "Cancel", wxPoint(0, 0), wxSize(largeButtonWidth, largeButtonHeight));
|
||||
wxButton* helpButton = new wxButton(this, wxID_HELP, "Help", wxPoint(0, 0), wxSize(largeButtonWidth, largeButtonHeight));
|
||||
|
||||
// Constraints for the notebook
|
||||
wxLayoutConstraints *c = new wxLayoutConstraints;
|
||||
c->top.SameAs (this, wxTop, 5);
|
||||
c->left.SameAs (this, wxLeft, 5);
|
||||
c->right.SameAs (this, wxRight, 5);
|
||||
c->bottom.SameAs (helpButton, wxTop, 5);
|
||||
m_notebook->SetConstraints(c);
|
||||
|
||||
// Constraints for the Help button
|
||||
c = new wxLayoutConstraints;
|
||||
c->width.AsIs();
|
||||
c->height.AsIs();
|
||||
c->right.SameAs (this, wxRight, 5);
|
||||
c->bottom.SameAs (this, wxBottom, 5);
|
||||
helpButton->SetConstraints(c);
|
||||
|
||||
// Constraints for the Cancel button
|
||||
c = new wxLayoutConstraints;
|
||||
c->width.AsIs();
|
||||
c->height.AsIs();
|
||||
c->right.SameAs (helpButton, wxLeft, 5);
|
||||
c->bottom.SameAs (this, wxBottom, 5);
|
||||
cancelButton->SetConstraints(c);
|
||||
|
||||
// Constraints for the OK button
|
||||
c = new wxLayoutConstraints;
|
||||
c->width.AsIs();
|
||||
c->height.AsIs();
|
||||
c->right.SameAs (cancelButton, wxLeft, 5);
|
||||
c->bottom.SameAs (this, wxBottom, 5);
|
||||
okButton->SetConstraints(c);
|
||||
|
||||
okButton->SetDefault();
|
||||
okButton->SetFocus();
|
||||
|
||||
SetDefaults();
|
||||
|
||||
Layout();
|
||||
Centre(wxBOTH);
|
||||
}
|
||||
|
||||
void csShapePropertiesDialog::OnOK(wxCommandEvent& event)
|
||||
{
|
||||
wxTextCtrl* textCtrl = (wxTextCtrl*) m_generalPropertiesDialog->FindWindow(ID_LABELTEXT);
|
||||
wxASSERT( (textCtrl != NULL) );
|
||||
|
||||
m_generalPropertiesDialog->SetShapeLabel(textCtrl->GetValue());
|
||||
|
||||
wxDialog::OnOK(event);
|
||||
}
|
||||
|
||||
// Set some suitable defaults in the attribute dialogs (in the first instance,
|
||||
// just set all wxChoices to the first element)
|
||||
void csShapePropertiesDialog::SetDefaults()
|
||||
{
|
||||
if (!m_attributeDialog)
|
||||
return;
|
||||
|
||||
wxNode* node = m_attributeDialog->GetChildren().First();
|
||||
while (node)
|
||||
{
|
||||
wxWindow* child = (wxWindow*) node->Data();
|
||||
if (child->IsKindOf(CLASSINFO(wxChoice)))
|
||||
{
|
||||
wxChoice* choice = (wxChoice*) child;
|
||||
choice->SetSelection(0);
|
||||
}
|
||||
node = node->Next();
|
||||
}
|
||||
|
||||
if (!m_alternativeAttributeDialog)
|
||||
return;
|
||||
|
||||
node = m_alternativeAttributeDialog->GetChildren().First();
|
||||
while (node)
|
||||
{
|
||||
wxWindow* child = (wxWindow*) node->Data();
|
||||
if (child->IsKindOf(CLASSINFO(wxChoice)))
|
||||
{
|
||||
wxChoice* choice = (wxChoice*) child;
|
||||
choice->SetSelection(0);
|
||||
}
|
||||
node = node->Next();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* csGeneralShapePropertiesDialog
|
||||
*/
|
||||
|
||||
IMPLEMENT_CLASS(csGeneralShapePropertiesDialog, wxPanel)
|
||||
|
||||
BEGIN_EVENT_TABLE(csGeneralShapePropertiesDialog, wxPanel)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
csGeneralShapePropertiesDialog::csGeneralShapePropertiesDialog()
|
||||
{
|
||||
}
|
||||
|
||||
void csGeneralShapePropertiesDialog::SetShapeLabel(const wxString& label)
|
||||
{
|
||||
wxTextCtrl* textCtrl = (wxTextCtrl*) FindWindow(ID_LABELTEXT);
|
||||
wxASSERT( (textCtrl != NULL) );
|
||||
|
||||
m_label = label;
|
||||
|
||||
textCtrl->SetValue(label);
|
||||
}
|
||||
|
||||
/*
|
||||
* csThinRectangleDialog
|
||||
*/
|
||||
|
||||
IMPLEMENT_CLASS(csThinRectangleDialog, wxPanel)
|
||||
|
||||
BEGIN_EVENT_TABLE(csThinRectangleDialog, wxPanel)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
csThinRectangleDialog::csThinRectangleDialog()
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* csWideRectangleDialog
|
||||
*/
|
||||
|
||||
IMPLEMENT_CLASS(csWideRectangleDialog, wxPanel)
|
||||
|
||||
BEGIN_EVENT_TABLE(csWideRectangleDialog, wxPanel)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
csWideRectangleDialog::csWideRectangleDialog()
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* csTriangleDialog
|
||||
*/
|
||||
|
||||
IMPLEMENT_CLASS(csTriangleDialog, wxPanel)
|
||||
|
||||
BEGIN_EVENT_TABLE(csTriangleDialog, wxPanel)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
csTriangleDialog::csTriangleDialog()
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* csSemiCircleDialog
|
||||
*/
|
||||
|
||||
IMPLEMENT_CLASS(csSemiCircleDialog, wxPanel)
|
||||
|
||||
BEGIN_EVENT_TABLE(csSemiCircleDialog, wxPanel)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
csSemiCircleDialog::csSemiCircleDialog()
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* csCircleDialog
|
||||
*/
|
||||
|
||||
IMPLEMENT_CLASS(csCircleDialog, wxPanel)
|
||||
|
||||
BEGIN_EVENT_TABLE(csCircleDialog, wxPanel)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
csCircleDialog::csCircleDialog()
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* csCircleShadowDialog
|
||||
*/
|
||||
|
||||
IMPLEMENT_CLASS(csCircleShadowDialog, wxPanel)
|
||||
|
||||
BEGIN_EVENT_TABLE(csCircleShadowDialog, wxPanel)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
csCircleShadowDialog::csCircleShadowDialog()
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* csOctagonDialog
|
||||
*/
|
||||
|
||||
IMPLEMENT_CLASS(csOctagonDialog, wxPanel)
|
||||
|
||||
BEGIN_EVENT_TABLE(csOctagonDialog, wxPanel)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
csOctagonDialog::csOctagonDialog()
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* csGroupDialog
|
||||
*/
|
||||
|
||||
IMPLEMENT_CLASS(csGroupDialog, wxPanel)
|
||||
|
||||
BEGIN_EVENT_TABLE(csGroupDialog, wxPanel)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
csGroupDialog::csGroupDialog()
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* csTextBoxDialog
|
||||
*/
|
||||
|
||||
IMPLEMENT_CLASS(csTextBoxDialog, wxPanel)
|
||||
|
||||
BEGIN_EVENT_TABLE(csTextBoxDialog, wxPanel)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
csTextBoxDialog::csTextBoxDialog()
|
||||
{
|
||||
}
|
||||
|
||||
|
248
utils/ogl/samples/studio/dialogs.h
Normal file
@ -0,0 +1,248 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: dialogs.h
|
||||
// Purpose: Miscellaneous dialogs
|
||||
// Author: Julian Smart
|
||||
// Modified by:
|
||||
// Created: 12/07/98
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) Julian Smart
|
||||
// Licence:
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _STUDIO_DIALOGS_H_
|
||||
#define _STUDIO_DIALOGS_H_
|
||||
|
||||
#ifdef __GNUG__
|
||||
// #pragma interface
|
||||
#endif
|
||||
|
||||
#include <wx/wx.h>
|
||||
#include <wx/notebook.h>
|
||||
|
||||
/*
|
||||
* Label editing dialog (about to become obsolete)
|
||||
*/
|
||||
|
||||
class csLabelEditingDialog: public wxDialog
|
||||
{
|
||||
DECLARE_CLASS(csLabelEditingDialog)
|
||||
public:
|
||||
csLabelEditingDialog(wxWindow* parent);
|
||||
|
||||
void SetShapeLabel(const wxString& label);
|
||||
inline wxString GetShapeLabel() const { return m_label; }
|
||||
|
||||
void OnOK(wxCommandEvent& event);
|
||||
|
||||
protected:
|
||||
wxString m_label;
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
/*
|
||||
* Settings dialog (tabbed)
|
||||
*/
|
||||
|
||||
class csSettingsDialog: public wxDialog
|
||||
{
|
||||
DECLARE_CLASS(csSettingsDialog)
|
||||
public:
|
||||
csSettingsDialog(wxWindow* parent);
|
||||
|
||||
void OnOK(wxCommandEvent& event);
|
||||
|
||||
virtual bool TransferDataToWindow();
|
||||
virtual bool TransferDataFromWindow();
|
||||
|
||||
protected:
|
||||
|
||||
wxPanel* m_generalSettings;
|
||||
wxPanel* m_diagramSettings;
|
||||
wxNotebook* m_notebook;
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
#define ID_PROPERTY_NOTEBOOK 1000
|
||||
#define ID_GENERAL_SETTINGS 1002
|
||||
#define ID_DIAGRAM_SETTINGS 1003
|
||||
|
||||
/*
|
||||
* csGeneralShapePropertiesDialog
|
||||
* Name, description etc.
|
||||
*/
|
||||
|
||||
class csGeneralShapePropertiesDialog: public wxPanel
|
||||
{
|
||||
DECLARE_CLASS(csGeneralShapePropertiesDialog)
|
||||
public:
|
||||
csGeneralShapePropertiesDialog();
|
||||
|
||||
void SetShapeLabel(const wxString& label);
|
||||
inline wxString GetShapeLabel() const { return m_label; }
|
||||
|
||||
protected:
|
||||
wxString m_label;
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
/*
|
||||
* Shape properties dialog (tabbed)
|
||||
*/
|
||||
|
||||
class csShapePropertiesDialog: public wxDialog
|
||||
{
|
||||
DECLARE_CLASS(csShapePropertiesDialog)
|
||||
public:
|
||||
csShapePropertiesDialog(wxWindow* parent, const wxString& title, wxPanel* attributeDialog, const wxString& attributeDialogName);
|
||||
|
||||
void OnOK(wxCommandEvent& event);
|
||||
|
||||
// Set some suitable defaults in the attribute dialogs (in the first instance,
|
||||
// just set all wxChoices to the first element)
|
||||
void SetDefaults();
|
||||
|
||||
// Accessors
|
||||
csGeneralShapePropertiesDialog* GetGeneralPropertiesDialog() const { return m_generalPropertiesDialog; }
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
// Attributes, specific to each shape
|
||||
wxPanel* m_attributeDialog;
|
||||
wxPanel* m_alternativeAttributeDialog;
|
||||
|
||||
// General properties, same for each shape, e.g. name/description
|
||||
csGeneralShapePropertiesDialog* m_generalPropertiesDialog;
|
||||
|
||||
wxNotebook* m_notebook;
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
#define ID_SHAPE_PROPERTY_NOTEBOOK 1000
|
||||
|
||||
//// Specific attribute-editing panel classes below here
|
||||
|
||||
/*
|
||||
* csThinRectangleDialog
|
||||
*/
|
||||
|
||||
class csThinRectangleDialog: public wxPanel
|
||||
{
|
||||
DECLARE_CLASS(csThinRectangleDialog)
|
||||
public:
|
||||
csThinRectangleDialog();
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
/*
|
||||
* csWideRectangleDialog
|
||||
*/
|
||||
|
||||
class csWideRectangleDialog: public wxPanel
|
||||
{
|
||||
DECLARE_CLASS(csWideRectangleDialog)
|
||||
public:
|
||||
csWideRectangleDialog();
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
/*
|
||||
* csTriangleDialog
|
||||
*/
|
||||
|
||||
class csTriangleDialog: public wxPanel
|
||||
{
|
||||
DECLARE_CLASS(csTriangleDialog)
|
||||
public:
|
||||
csTriangleDialog();
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
/*
|
||||
* csSemiCircleDialog
|
||||
*/
|
||||
|
||||
class csSemiCircleDialog: public wxPanel
|
||||
{
|
||||
DECLARE_CLASS(csSemiCircleDialog)
|
||||
public:
|
||||
csSemiCircleDialog();
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
/*
|
||||
* csCircleDialog
|
||||
*/
|
||||
|
||||
class csCircleDialog: public wxPanel
|
||||
{
|
||||
DECLARE_CLASS(csCircleDialog)
|
||||
public:
|
||||
csCircleDialog();
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
/*
|
||||
* csCircleShadowDialog
|
||||
*/
|
||||
|
||||
class csCircleShadowDialog: public wxPanel
|
||||
{
|
||||
DECLARE_CLASS(csCircleShadowDialog)
|
||||
public:
|
||||
csCircleShadowDialog();
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
/*
|
||||
* csOctagonDialog
|
||||
*/
|
||||
|
||||
class csOctagonDialog: public wxPanel
|
||||
{
|
||||
DECLARE_CLASS(csOctagonDialog)
|
||||
public:
|
||||
csOctagonDialog();
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
/*
|
||||
* csGroupDialog
|
||||
*/
|
||||
|
||||
class csGroupDialog: public wxPanel
|
||||
{
|
||||
DECLARE_CLASS(csGroupDialog)
|
||||
public:
|
||||
csGroupDialog();
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
/*
|
||||
* csTextBoxDialog
|
||||
*/
|
||||
|
||||
class csTextBoxDialog: public wxPanel
|
||||
{
|
||||
DECLARE_CLASS(csTextBoxDialog)
|
||||
public:
|
||||
csTextBoxDialog();
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
// _STUDIO_DIALOGS_H_
|
598
utils/ogl/samples/studio/doc.cpp
Normal file
@ -0,0 +1,598 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: doc.cpp
|
||||
// Purpose: Implements document functionality
|
||||
// Author: Julian Smart
|
||||
// Modified by:
|
||||
// Created: 12/07/98
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) Julian Smart
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __GNUG__
|
||||
// #pragma implementation
|
||||
#endif
|
||||
|
||||
// For compilers that support precompilation, includes "wx.h".
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
#include <wx/wxexpr.h>
|
||||
|
||||
#include "studio.h"
|
||||
#include "doc.h"
|
||||
#include "view.h"
|
||||
#include "basicp.h"
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(csDiagramDocument, wxDocument)
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable:4355)
|
||||
#endif
|
||||
|
||||
csDiagramDocument::csDiagramDocument():m_diagram(this)
|
||||
{
|
||||
}
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(default:4355)
|
||||
#endif
|
||||
|
||||
csDiagramDocument::~csDiagramDocument()
|
||||
{
|
||||
}
|
||||
|
||||
bool csDiagramDocument::OnCloseDocument()
|
||||
{
|
||||
m_diagram.DeleteAllShapes();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool csDiagramDocument::OnSaveDocument(const wxString& file)
|
||||
{
|
||||
if (file == "")
|
||||
return FALSE;
|
||||
|
||||
if (!m_diagram.SaveFile(file))
|
||||
{
|
||||
wxString msgTitle;
|
||||
if (wxTheApp->GetAppName() != "")
|
||||
msgTitle = wxTheApp->GetAppName();
|
||||
else
|
||||
msgTitle = wxString("File error");
|
||||
|
||||
(void)wxMessageBox("Sorry, could not open this file for saving.", msgTitle, wxOK | wxICON_EXCLAMATION,
|
||||
GetDocumentWindow());
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Modify(FALSE);
|
||||
SetFilename(file);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool csDiagramDocument::OnOpenDocument(const wxString& file)
|
||||
{
|
||||
if (!OnSaveModified())
|
||||
return FALSE;
|
||||
|
||||
wxString msgTitle;
|
||||
if (wxTheApp->GetAppName() != "")
|
||||
msgTitle = wxTheApp->GetAppName();
|
||||
else
|
||||
msgTitle = wxString("File error");
|
||||
|
||||
m_diagram.DeleteAllShapes();
|
||||
if (!m_diagram.LoadFile(file))
|
||||
{
|
||||
(void)wxMessageBox("Sorry, could not open this file.", msgTitle, wxOK|wxICON_EXCLAMATION,
|
||||
GetDocumentWindow());
|
||||
return FALSE;
|
||||
}
|
||||
SetFilename(file, TRUE);
|
||||
Modify(FALSE);
|
||||
UpdateAllViews();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Implementation of drawing command
|
||||
*/
|
||||
|
||||
csDiagramCommand::csDiagramCommand(const wxString& name, csDiagramDocument *doc,
|
||||
csCommandState* onlyState):
|
||||
wxCommand(TRUE, name)
|
||||
{
|
||||
m_doc = doc;
|
||||
|
||||
if (onlyState)
|
||||
{
|
||||
AddState(onlyState);
|
||||
}
|
||||
}
|
||||
|
||||
csDiagramCommand::~csDiagramCommand()
|
||||
{
|
||||
wxNode* node = m_states.First();
|
||||
while (node)
|
||||
{
|
||||
csCommandState* state = (csCommandState*) node->Data();
|
||||
delete state;
|
||||
node = node->Next();
|
||||
}
|
||||
}
|
||||
|
||||
void csDiagramCommand::AddState(csCommandState* state)
|
||||
{
|
||||
state->m_doc = m_doc;
|
||||
// state->m_cmd = m_cmd;
|
||||
m_states.Append(state);
|
||||
}
|
||||
|
||||
// Insert a state at the beginning of the list
|
||||
void csDiagramCommand::InsertState(csCommandState* state)
|
||||
{
|
||||
state->m_doc = m_doc;
|
||||
// state->m_cmd = m_cmd;
|
||||
m_states.Insert(state);
|
||||
}
|
||||
|
||||
// Schedule all lines connected to the states to be cut.
|
||||
void csDiagramCommand::RemoveLines()
|
||||
{
|
||||
wxNode* node = m_states.First();
|
||||
while (node)
|
||||
{
|
||||
csCommandState* state = (csCommandState*) node->Data();
|
||||
wxShape* shape = state->GetShapeOnCanvas();
|
||||
wxASSERT( (shape != NULL) );
|
||||
|
||||
wxNode *node1 = shape->GetLines().First();
|
||||
while (node1)
|
||||
{
|
||||
wxLineShape *line = (wxLineShape *)node1->Data();
|
||||
if (!FindStateByShape(line))
|
||||
{
|
||||
csCommandState* newState = new csCommandState(ID_CS_CUT, NULL, line);
|
||||
InsertState(newState);
|
||||
}
|
||||
|
||||
node1 = node1->Next();
|
||||
}
|
||||
node = node->Next();
|
||||
}
|
||||
}
|
||||
|
||||
csCommandState* csDiagramCommand::FindStateByShape(wxShape* shape)
|
||||
{
|
||||
wxNode* node = m_states.First();
|
||||
while (node)
|
||||
{
|
||||
csCommandState* state = (csCommandState*) node->Data();
|
||||
if (shape == state->GetShapeOnCanvas() || shape == state->GetSavedState())
|
||||
return state;
|
||||
node = node->Next();
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool csDiagramCommand::Do()
|
||||
{
|
||||
wxNode* node = m_states.First();
|
||||
while (node)
|
||||
{
|
||||
csCommandState* state = (csCommandState*) node->Data();
|
||||
if (!state->Do())
|
||||
return FALSE;
|
||||
node = node->Next();
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool csDiagramCommand::Undo()
|
||||
{
|
||||
// Undo in reverse order, so e.g. shapes get added
|
||||
// back before the lines do.
|
||||
wxNode* node = m_states.Last();
|
||||
while (node)
|
||||
{
|
||||
csCommandState* state = (csCommandState*) node->Data();
|
||||
if (!state->Undo())
|
||||
return FALSE;
|
||||
node = node->Previous();
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
csCommandState::csCommandState(int cmd, wxShape* savedState, wxShape* shapeOnCanvas)
|
||||
{
|
||||
m_cmd = cmd;
|
||||
m_doc = NULL;
|
||||
m_savedState = savedState;
|
||||
m_shapeOnCanvas = shapeOnCanvas;
|
||||
m_linePositionFrom = 0;
|
||||
m_linePositionTo = 0;
|
||||
}
|
||||
|
||||
csCommandState::~csCommandState()
|
||||
{
|
||||
if (m_savedState)
|
||||
{
|
||||
m_savedState->SetCanvas(NULL);
|
||||
delete m_savedState;
|
||||
}
|
||||
}
|
||||
|
||||
bool csCommandState::Do()
|
||||
{
|
||||
switch (m_cmd)
|
||||
{
|
||||
case ID_CS_CUT:
|
||||
{
|
||||
// New state is 'nothing' - maybe pass shape ID to state so we know what
|
||||
// we're talking about.
|
||||
// Then save old shape in m_savedState (actually swap pointers)
|
||||
|
||||
wxASSERT( (m_shapeOnCanvas != NULL) );
|
||||
wxASSERT( (m_savedState == NULL) ); // new state will be 'nothing'
|
||||
wxASSERT( (m_doc != NULL) );
|
||||
|
||||
wxShapeCanvas* canvas = m_shapeOnCanvas->GetCanvas();
|
||||
|
||||
// In case this is a line
|
||||
wxShape* lineFrom = NULL;
|
||||
wxShape* lineTo = NULL;
|
||||
int attachmentFrom = 0, attachmentTo = 0;
|
||||
|
||||
if (m_shapeOnCanvas->IsKindOf(CLASSINFO(wxLineShape)))
|
||||
{
|
||||
// Store the from/to info to save in the line shape
|
||||
wxLineShape* lineShape = (wxLineShape*) m_shapeOnCanvas;
|
||||
lineFrom = lineShape->GetFrom();
|
||||
lineTo = lineShape->GetTo();
|
||||
attachmentFrom = lineShape->GetAttachmentFrom();
|
||||
attachmentTo = lineShape->GetAttachmentTo();
|
||||
|
||||
m_linePositionFrom = lineFrom->GetLinePosition(lineShape);
|
||||
m_linePositionTo = lineTo->GetLinePosition(lineShape);
|
||||
}
|
||||
|
||||
m_shapeOnCanvas->Select(FALSE);
|
||||
((csDiagramView*) m_doc->GetFirstView())->SelectShape(m_shapeOnCanvas, FALSE);
|
||||
|
||||
m_shapeOnCanvas->Unlink();
|
||||
|
||||
m_doc->GetDiagram()->RemoveShape(m_shapeOnCanvas);
|
||||
|
||||
m_savedState = m_shapeOnCanvas;
|
||||
|
||||
if (m_savedState->IsKindOf(CLASSINFO(wxLineShape)))
|
||||
{
|
||||
// Restore the from/to info for future reference
|
||||
wxLineShape* lineShape = (wxLineShape*) m_savedState;
|
||||
lineShape->SetFrom(lineFrom);
|
||||
lineShape->SetTo(lineTo);
|
||||
lineShape->SetAttachments(attachmentFrom, attachmentTo);
|
||||
|
||||
wxClientDC dc(canvas);
|
||||
canvas->PrepareDC(dc);
|
||||
|
||||
lineFrom->MoveLinks(dc);
|
||||
lineTo->MoveLinks(dc);
|
||||
}
|
||||
|
||||
m_doc->Modify(TRUE);
|
||||
m_doc->UpdateAllViews();
|
||||
break;
|
||||
}
|
||||
case ID_CS_ADD_SHAPE:
|
||||
case ID_CS_ADD_SHAPE_SELECT:
|
||||
{
|
||||
// The app has given the command state a new m_savedState
|
||||
// shape, which is the new shape to add to the canvas (but
|
||||
// not actually added until this point).
|
||||
// The new 'saved state' is therefore 'nothing' since there
|
||||
// was nothing there before.
|
||||
|
||||
wxASSERT( (m_shapeOnCanvas == NULL) );
|
||||
wxASSERT( (m_savedState != NULL) );
|
||||
wxASSERT( (m_doc != NULL) );
|
||||
|
||||
m_shapeOnCanvas = m_savedState;
|
||||
m_savedState = NULL;
|
||||
|
||||
m_doc->GetDiagram()->AddShape(m_shapeOnCanvas);
|
||||
m_shapeOnCanvas->Show(TRUE);
|
||||
|
||||
wxClientDC dc(m_shapeOnCanvas->GetCanvas());
|
||||
m_shapeOnCanvas->GetCanvas()->PrepareDC(dc);
|
||||
|
||||
csEvtHandler *handler = (csEvtHandler *)m_shapeOnCanvas->GetEventHandler();
|
||||
m_shapeOnCanvas->FormatText(dc, handler->m_label);
|
||||
|
||||
m_shapeOnCanvas->Move(dc, m_shapeOnCanvas->GetX(), m_shapeOnCanvas->GetY());
|
||||
|
||||
if (m_cmd == ID_CS_ADD_SHAPE_SELECT)
|
||||
{
|
||||
m_shapeOnCanvas->Select(TRUE, &dc);
|
||||
((csDiagramView*) m_doc->GetFirstView())->SelectShape(m_shapeOnCanvas, TRUE);
|
||||
}
|
||||
|
||||
m_doc->Modify(TRUE);
|
||||
m_doc->UpdateAllViews();
|
||||
break;
|
||||
}
|
||||
case ID_CS_ADD_LINE:
|
||||
case ID_CS_ADD_LINE_SELECT:
|
||||
{
|
||||
wxASSERT( (m_shapeOnCanvas == NULL) );
|
||||
wxASSERT( (m_savedState != NULL) );
|
||||
wxASSERT( (m_doc != NULL) );
|
||||
|
||||
wxLineShape *lineShape = (wxLineShape *)m_savedState;
|
||||
wxASSERT( (lineShape->GetFrom() != NULL) );
|
||||
wxASSERT( (lineShape->GetTo() != NULL) );
|
||||
|
||||
m_shapeOnCanvas = m_savedState;
|
||||
m_savedState = NULL;
|
||||
|
||||
m_doc->GetDiagram()->AddShape(lineShape);
|
||||
|
||||
lineShape->GetFrom()->AddLine(lineShape, lineShape->GetTo(),
|
||||
lineShape->GetAttachmentFrom(), lineShape->GetAttachmentTo());
|
||||
|
||||
lineShape->Show(TRUE);
|
||||
|
||||
wxClientDC dc(lineShape->GetCanvas());
|
||||
lineShape->GetCanvas()->PrepareDC(dc);
|
||||
|
||||
// It won't get drawn properly unless you move both
|
||||
// connected images
|
||||
lineShape->GetFrom()->Move(dc, lineShape->GetFrom()->GetX(), lineShape->GetFrom()->GetY());
|
||||
lineShape->GetTo()->Move(dc, lineShape->GetTo()->GetX(), lineShape->GetTo()->GetY());
|
||||
|
||||
if (m_cmd == ID_CS_ADD_LINE_SELECT)
|
||||
{
|
||||
lineShape->Select(TRUE, &dc);
|
||||
((csDiagramView*) m_doc->GetFirstView())->SelectShape(m_shapeOnCanvas, TRUE);
|
||||
}
|
||||
|
||||
m_doc->Modify(TRUE);
|
||||
m_doc->UpdateAllViews();
|
||||
break;
|
||||
}
|
||||
case ID_CS_CHANGE_BACKGROUND_COLOUR:
|
||||
case ID_CS_MOVE:
|
||||
case ID_CS_SIZE:
|
||||
case ID_CS_EDIT_PROPERTIES:
|
||||
case ID_CS_FONT_CHANGE:
|
||||
case ID_CS_ARROW_CHANGE:
|
||||
case ID_CS_ROTATE_CLOCKWISE:
|
||||
case ID_CS_ROTATE_ANTICLOCKWISE:
|
||||
case ID_CS_CHANGE_LINE_ORDERING:
|
||||
case ID_CS_CHANGE_LINE_ATTACHMENT:
|
||||
case ID_CS_ALIGN:
|
||||
case ID_CS_NEW_POINT:
|
||||
case ID_CS_CUT_POINT:
|
||||
case ID_CS_MOVE_LINE_POINT:
|
||||
case ID_CS_STRAIGHTEN:
|
||||
case ID_CS_MOVE_LABEL:
|
||||
{
|
||||
// At this point we have been given a new shape
|
||||
// just like the old one but with a changed colour.
|
||||
// It's now time to apply that change to the
|
||||
// shape on the canvas, saving the old state.
|
||||
// NOTE: this is general enough to work with MOST attribute
|
||||
// changes!
|
||||
|
||||
wxASSERT( (m_shapeOnCanvas != NULL) );
|
||||
wxASSERT( (m_savedState != NULL) ); // This is the new shape with changed colour
|
||||
wxASSERT( (m_doc != NULL) );
|
||||
|
||||
wxClientDC dc(m_shapeOnCanvas->GetCanvas());
|
||||
m_shapeOnCanvas->GetCanvas()->PrepareDC(dc);
|
||||
|
||||
bool isSelected = m_shapeOnCanvas->Selected();
|
||||
if (isSelected)
|
||||
m_shapeOnCanvas->Select(FALSE, & dc);
|
||||
|
||||
if (m_cmd == ID_CS_SIZE || m_cmd == ID_CS_ROTATE_CLOCKWISE || m_cmd == ID_CS_ROTATE_ANTICLOCKWISE ||
|
||||
m_cmd == ID_CS_CHANGE_LINE_ORDERING || m_cmd == ID_CS_CHANGE_LINE_ATTACHMENT)
|
||||
{
|
||||
m_shapeOnCanvas->Erase(dc);
|
||||
}
|
||||
|
||||
// TODO: make sure the ID is the same. Or, when applying the new state,
|
||||
// don't change the original ID.
|
||||
wxShape* tempShape = m_shapeOnCanvas->CreateNewCopy();
|
||||
|
||||
// Apply the saved state to the shape on the canvas, by copying.
|
||||
m_savedState->CopyWithHandler(*m_shapeOnCanvas);
|
||||
|
||||
// Delete this state now it's been used (m_shapeOnCanvas currently holds this state)
|
||||
delete m_savedState;
|
||||
|
||||
// Remember the previous state
|
||||
m_savedState = tempShape;
|
||||
|
||||
// Redraw the shape
|
||||
|
||||
if (m_cmd == ID_CS_MOVE || m_cmd == ID_CS_ROTATE_CLOCKWISE || m_cmd == ID_CS_ROTATE_ANTICLOCKWISE ||
|
||||
m_cmd == ID_CS_ALIGN)
|
||||
{
|
||||
m_shapeOnCanvas->Move(dc, m_shapeOnCanvas->GetX(), m_shapeOnCanvas->GetY());
|
||||
|
||||
csEvtHandler *handler = (csEvtHandler *)m_shapeOnCanvas->GetEventHandler();
|
||||
m_shapeOnCanvas->FormatText(dc, handler->m_label);
|
||||
m_shapeOnCanvas->Draw(dc);
|
||||
}
|
||||
else if (m_cmd == ID_CS_CHANGE_LINE_ORDERING)
|
||||
{
|
||||
m_shapeOnCanvas->MoveLinks(dc);
|
||||
}
|
||||
else if (m_cmd == ID_CS_CHANGE_LINE_ATTACHMENT)
|
||||
{
|
||||
wxLineShape *lineShape = (wxLineShape *)m_shapeOnCanvas;
|
||||
|
||||
// Have to move both sets of links since we don't know which links
|
||||
// have been affected (unless we compared before and after states).
|
||||
lineShape->GetFrom()->MoveLinks(dc);
|
||||
lineShape->GetTo()->MoveLinks(dc);
|
||||
}
|
||||
else if (m_cmd == ID_CS_SIZE)
|
||||
{
|
||||
double width, height;
|
||||
m_shapeOnCanvas->GetBoundingBoxMax(&width, &height);
|
||||
|
||||
m_shapeOnCanvas->SetSize(width, height);
|
||||
m_shapeOnCanvas->Move(dc, m_shapeOnCanvas->GetX(), m_shapeOnCanvas->GetY());
|
||||
|
||||
m_shapeOnCanvas->Show(TRUE);
|
||||
|
||||
// Recursively redraw links if we have a composite.
|
||||
if (m_shapeOnCanvas->GetChildren().Number() > 0)
|
||||
m_shapeOnCanvas->DrawLinks(dc, -1, TRUE);
|
||||
|
||||
m_shapeOnCanvas->GetEventHandler()->OnEndSize(width, height);
|
||||
}
|
||||
else if (m_cmd == ID_CS_EDIT_PROPERTIES || m_cmd == ID_CS_FONT_CHANGE)
|
||||
{
|
||||
csEvtHandler *handler = (csEvtHandler *)m_shapeOnCanvas->GetEventHandler();
|
||||
m_shapeOnCanvas->FormatText(dc, handler->m_label);
|
||||
m_shapeOnCanvas->Draw(dc);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_shapeOnCanvas->Draw(dc);
|
||||
}
|
||||
|
||||
if (isSelected)
|
||||
m_shapeOnCanvas->Select(TRUE, & dc);
|
||||
|
||||
m_doc->Modify(TRUE);
|
||||
m_doc->UpdateAllViews();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool csCommandState::Undo()
|
||||
{
|
||||
switch (m_cmd)
|
||||
{
|
||||
case ID_CS_CUT:
|
||||
{
|
||||
wxASSERT( (m_savedState != NULL) );
|
||||
wxASSERT( (m_doc != NULL) );
|
||||
|
||||
m_doc->GetDiagram()->AddShape(m_savedState);
|
||||
m_shapeOnCanvas = m_savedState;
|
||||
m_savedState = NULL;
|
||||
|
||||
if (m_shapeOnCanvas->IsKindOf(CLASSINFO(wxLineShape)))
|
||||
{
|
||||
wxLineShape* lineShape = (wxLineShape*) m_shapeOnCanvas;
|
||||
lineShape->GetFrom()->AddLine(lineShape, lineShape->GetTo(),
|
||||
lineShape->GetAttachmentFrom(), lineShape->GetAttachmentTo(),
|
||||
m_linePositionFrom, m_linePositionTo);
|
||||
|
||||
wxShapeCanvas* canvas = lineShape->GetFrom()->GetCanvas();
|
||||
|
||||
wxClientDC dc(canvas);
|
||||
canvas->PrepareDC(dc);
|
||||
|
||||
lineShape->GetFrom()->MoveLinks(dc);
|
||||
lineShape->GetTo()->MoveLinks(dc);
|
||||
|
||||
}
|
||||
m_shapeOnCanvas->Show(TRUE);
|
||||
|
||||
m_doc->Modify(TRUE);
|
||||
m_doc->UpdateAllViews();
|
||||
break;
|
||||
}
|
||||
case ID_CS_ADD_SHAPE:
|
||||
case ID_CS_ADD_LINE:
|
||||
case ID_CS_ADD_SHAPE_SELECT:
|
||||
case ID_CS_ADD_LINE_SELECT:
|
||||
{
|
||||
wxASSERT( (m_shapeOnCanvas != NULL) );
|
||||
wxASSERT( (m_savedState == NULL) );
|
||||
wxASSERT( (m_doc != NULL) );
|
||||
|
||||
// In case this is a line
|
||||
wxShape* lineFrom = NULL;
|
||||
wxShape* lineTo = NULL;
|
||||
int attachmentFrom = 0, attachmentTo = 0;
|
||||
|
||||
if (m_shapeOnCanvas->IsKindOf(CLASSINFO(wxLineShape)))
|
||||
{
|
||||
// Store the from/to info to save in the line shape
|
||||
wxLineShape* lineShape = (wxLineShape*) m_shapeOnCanvas;
|
||||
lineFrom = lineShape->GetFrom();
|
||||
lineTo = lineShape->GetTo();
|
||||
attachmentFrom = lineShape->GetAttachmentFrom();
|
||||
attachmentTo = lineShape->GetAttachmentTo();
|
||||
}
|
||||
|
||||
wxClientDC dc(m_shapeOnCanvas->GetCanvas());
|
||||
m_shapeOnCanvas->GetCanvas()->PrepareDC(dc);
|
||||
|
||||
m_shapeOnCanvas->Select(FALSE, &dc);
|
||||
((csDiagramView*) m_doc->GetFirstView())->SelectShape(m_shapeOnCanvas, FALSE);
|
||||
m_doc->GetDiagram()->RemoveShape(m_shapeOnCanvas);
|
||||
m_shapeOnCanvas->Unlink(); // Unlinks the line, if it is a line
|
||||
|
||||
if (m_shapeOnCanvas->IsKindOf(CLASSINFO(wxLineShape)))
|
||||
{
|
||||
// Restore the from/to info for future reference
|
||||
wxLineShape* lineShape = (wxLineShape*) m_shapeOnCanvas;
|
||||
lineShape->SetFrom(lineFrom);
|
||||
lineShape->SetTo(lineTo);
|
||||
lineShape->SetAttachments(attachmentFrom, attachmentTo);
|
||||
}
|
||||
|
||||
m_savedState = m_shapeOnCanvas;
|
||||
m_shapeOnCanvas = NULL;
|
||||
|
||||
m_doc->Modify(TRUE);
|
||||
m_doc->UpdateAllViews();
|
||||
break;
|
||||
}
|
||||
case ID_CS_CHANGE_BACKGROUND_COLOUR:
|
||||
case ID_CS_MOVE:
|
||||
case ID_CS_SIZE:
|
||||
case ID_CS_EDIT_PROPERTIES:
|
||||
case ID_CS_FONT_CHANGE:
|
||||
case ID_CS_ARROW_CHANGE:
|
||||
case ID_CS_ROTATE_CLOCKWISE:
|
||||
case ID_CS_ROTATE_ANTICLOCKWISE:
|
||||
case ID_CS_CHANGE_LINE_ORDERING:
|
||||
case ID_CS_CHANGE_LINE_ATTACHMENT:
|
||||
case ID_CS_ALIGN:
|
||||
case ID_CS_NEW_POINT:
|
||||
case ID_CS_CUT_POINT:
|
||||
case ID_CS_MOVE_LINE_POINT:
|
||||
case ID_CS_STRAIGHTEN:
|
||||
case ID_CS_MOVE_LABEL:
|
||||
{
|
||||
// Exactly like the Do case; we're just swapping states.
|
||||
Do();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
134
utils/ogl/samples/studio/doc.h
Normal file
@ -0,0 +1,134 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: doc.h
|
||||
// Purpose: Document classes
|
||||
// Author: Julian Smart
|
||||
// Modified by:
|
||||
// Created: 12/07/98
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) Julian Smart
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _STUDIO_DOC_H_
|
||||
#define _STUDIO_DOC_H_
|
||||
|
||||
#ifdef __GNUG__
|
||||
// #pragma interface
|
||||
#endif
|
||||
|
||||
#include <wx/docview.h>
|
||||
#include <wx/string.h>
|
||||
#include <wx/wxexpr.h>
|
||||
|
||||
#include "ogl.h"
|
||||
#include "shapes.h"
|
||||
|
||||
/*
|
||||
* A diagram document, which contains a diagram.
|
||||
*/
|
||||
|
||||
class csDiagramDocument: public wxDocument
|
||||
{
|
||||
DECLARE_DYNAMIC_CLASS(csDiagramDocument)
|
||||
public:
|
||||
csDiagramDocument();
|
||||
~csDiagramDocument();
|
||||
|
||||
bool OnSaveDocument(const wxString& file);
|
||||
bool OnOpenDocument(const wxString& file);
|
||||
|
||||
inline wxDiagram *GetDiagram() { return &m_diagram; }
|
||||
|
||||
bool OnCloseDocument();
|
||||
|
||||
protected:
|
||||
csDiagram m_diagram;
|
||||
};
|
||||
|
||||
/*
|
||||
Do/Undo 30/7/98
|
||||
|
||||
1) We have a csCommandState, and in csDiagramCommand you have a list of
|
||||
these. This allows undo to work with several shapes at once.
|
||||
|
||||
2) Instead of storing info about each operation, e.g. separate pens, colours,
|
||||
etc., we simply use a copy of the shape.
|
||||
In csCommandState, we have a pointer to the actual shape in the canvas, m_currentShape.
|
||||
We also have wxShape* m_shapeState which stores the requested or previous state
|
||||
(depending on whether it's before the Do or after the Do.
|
||||
|
||||
- In Do: save a temp copy of the old m_currentShape (i.e. the state just before it's changed).
|
||||
Change the data pointed to by m_currentShape to the new attributes stored in m_shapeState.
|
||||
Now assign the temp copy to m_shapeState, for use in Undo.
|
||||
|
||||
wxShape* temp = m_currentShape->Copy(); // Take a copy of the current state
|
||||
m_currentShape->Set(m_shapeState); // Apply the new state (e.g. moving, changing colour etc.)
|
||||
delete m_shapeState; // Delete the previous 'old state'.
|
||||
m_shapeState = temp; // Remember the new 'old state'.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
class csCommandState;
|
||||
class csDiagramCommand: public wxCommand
|
||||
{
|
||||
friend class csCommandState;
|
||||
public:
|
||||
// Multi-purpose constructor for creating, deleting shapes
|
||||
csDiagramCommand(const wxString& name, csDiagramDocument *doc,
|
||||
csCommandState* onlyState = NULL); // Allow for the common case of just one state to change
|
||||
|
||||
~csDiagramCommand();
|
||||
|
||||
bool Do();
|
||||
bool Undo();
|
||||
|
||||
// Add a state to the end of the list
|
||||
void AddState(csCommandState* state);
|
||||
|
||||
// Insert a state at the beginning of the list
|
||||
void InsertState(csCommandState* state);
|
||||
|
||||
// Schedule all lines connected to the states to be cut.
|
||||
void RemoveLines();
|
||||
|
||||
// Find the state that refers to this shape
|
||||
csCommandState* FindStateByShape(wxShape* shape);
|
||||
|
||||
wxList& GetStates() const { return (wxList&) m_states; }
|
||||
|
||||
protected:
|
||||
csDiagramDocument* m_doc;
|
||||
wxList m_states;
|
||||
};
|
||||
|
||||
class csCommandState: public wxObject
|
||||
{
|
||||
friend class csDiagramCommand;
|
||||
public:
|
||||
csCommandState(int cmd, wxShape* savedState, wxShape* shapeOnCanvas);
|
||||
~csCommandState();
|
||||
|
||||
bool Do();
|
||||
bool Undo();
|
||||
|
||||
inline void SetSavedState(wxShape *s) { m_savedState = s; }
|
||||
inline wxShape *GetSavedState() const { return m_savedState; }
|
||||
|
||||
inline void SetShapeOnCanvas(wxShape *s) { m_shapeOnCanvas = s; }
|
||||
inline wxShape *GetShapeOnCanvas() const { return m_shapeOnCanvas; }
|
||||
protected:
|
||||
wxShape* m_savedState; // Previous state, for restoring on Undo
|
||||
wxShape* m_shapeOnCanvas; // The actual shape on the canvas
|
||||
csDiagramDocument* m_doc;
|
||||
int m_cmd;
|
||||
|
||||
// These store the line ordering for the shapes at either end,
|
||||
// so an un-cut line can restore the ordering properly. Otherwise
|
||||
// it just adds the line at an arbitrary position.
|
||||
int m_linePositionFrom;
|
||||
int m_linePositionTo;
|
||||
};
|
||||
|
||||
#endif
|
||||
// _STUDIO_DOC_H_
|
256
utils/ogl/samples/studio/mainfrm.cpp
Normal file
@ -0,0 +1,256 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: mainfrm.cpp
|
||||
// Purpose: Studio main frame
|
||||
// Author: Julian Smart
|
||||
// Modified by:
|
||||
// Created: 27/7/98
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) Julian Smart
|
||||
// Licence:
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// For compilers that support precompilation, includes "wx/wx.h".
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/wx.h"
|
||||
#include "wx/mdi.h"
|
||||
#endif
|
||||
|
||||
#include "wx/laywin.h"
|
||||
|
||||
#include "studio.h"
|
||||
#include "view.h"
|
||||
#include "doc.h"
|
||||
#include "cspalette.h"
|
||||
#include "mainfrm.h"
|
||||
#include "dialogs.h"
|
||||
|
||||
BEGIN_EVENT_TABLE(csFrame, wxDocMDIParentFrame)
|
||||
EVT_MENU(ID_CS_ABOUT, csFrame::OnAbout)
|
||||
EVT_MENU(wxID_EXIT, csFrame::OnQuit)
|
||||
EVT_MENU(wxID_HELP, csFrame::OnHelp)
|
||||
EVT_MENU(ID_CS_SETTINGS, csFrame::OnSettings)
|
||||
EVT_SIZE(csFrame::OnSize)
|
||||
EVT_SASH_DRAGGED(ID_LAYOUT_WINDOW_PALETTE, csFrame::OnSashDragPaletteWindow)
|
||||
EVT_SASH_DRAGGED(ID_LAYOUT_WINDOW_PROJECT, csFrame::OnSashDragProjectWindow)
|
||||
EVT_IDLE(csFrame::OnIdle)
|
||||
EVT_UPDATE_UI(wxID_PRINT, csFrame::OnUpdateDisable)
|
||||
EVT_UPDATE_UI(wxID_PREVIEW, csFrame::OnUpdateDisable)
|
||||
EVT_UPDATE_UI(wxID_SAVE, csFrame::OnSaveUpdate)
|
||||
EVT_UPDATE_UI(wxID_SAVEAS, csFrame::OnSaveUpdate)
|
||||
EVT_UPDATE_UI(wxID_UNDO, csFrame::OnUpdateDisable)
|
||||
EVT_UPDATE_UI(wxID_REDO, csFrame::OnUpdateDisable)
|
||||
EVT_UPDATE_UI(wxID_CUT, csFrame::OnUpdateDisable)
|
||||
EVT_UPDATE_UI(wxID_COPY, csFrame::OnUpdateDisable)
|
||||
EVT_UPDATE_UI(wxID_PASTE, csFrame::OnUpdateDisable)
|
||||
EVT_CLOSE(csFrame::OnCloseWindow)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
// Define my frame constructor
|
||||
csFrame::csFrame(wxDocManager* manager, wxFrame *parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size,
|
||||
long style):
|
||||
wxDocMDIParentFrame(manager, parent, id, title, pos, size, style, "frame")
|
||||
{
|
||||
CreateToolBar(wxNO_BORDER|wxTB_FLAT|wxTB_HORIZONTAL);
|
||||
wxGetApp().InitToolBar(GetToolBar());
|
||||
|
||||
// Accelerators
|
||||
wxAcceleratorEntry entries[4];
|
||||
|
||||
entries[0].Set(wxACCEL_NORMAL, WXK_F1, wxID_HELP);
|
||||
entries[1].Set(wxACCEL_CTRL, 'O', wxID_OPEN);
|
||||
entries[2].Set(wxACCEL_CTRL, 'N', wxID_NEW);
|
||||
entries[3].Set(wxACCEL_CTRL, 'P', wxID_PRINT);
|
||||
|
||||
wxAcceleratorTable accel(4, entries);
|
||||
SetAcceleratorTable(accel);
|
||||
}
|
||||
|
||||
void csFrame::OnHelp(wxCommandEvent& event)
|
||||
{
|
||||
wxGetApp().GetHelpController().DisplayContents();
|
||||
}
|
||||
|
||||
void csFrame::OnSettings(wxCommandEvent& event)
|
||||
{
|
||||
csSettingsDialog* dialog = new csSettingsDialog(this);
|
||||
int ret = dialog->ShowModal();
|
||||
dialog->Destroy();
|
||||
}
|
||||
|
||||
void csFrame::OnQuit(wxCommandEvent& event)
|
||||
{
|
||||
Close(TRUE);
|
||||
}
|
||||
|
||||
void csFrame::OnAbout(wxCommandEvent& event)
|
||||
{
|
||||
(void)wxMessageBox("OGL Studio\n(c) 1999, Julian Smart", "About OGL Studio", wxICON_INFORMATION);
|
||||
}
|
||||
|
||||
void csFrame::OnSashDragPaletteWindow(wxSashEvent& event)
|
||||
{
|
||||
if (event.GetDragStatus() == wxSASH_STATUS_OUT_OF_RANGE)
|
||||
return;
|
||||
|
||||
switch (event.GetId())
|
||||
{
|
||||
case ID_LAYOUT_WINDOW_PALETTE:
|
||||
{
|
||||
wxGetApp().GetDiagramPaletteSashWindow()->SetDefaultSize(wxSize(10000, event.GetDragRect().height));
|
||||
break;
|
||||
}
|
||||
}
|
||||
wxLayoutAlgorithm layout;
|
||||
layout.LayoutMDIFrame(this);
|
||||
}
|
||||
|
||||
void csFrame::OnSashDragProjectWindow(wxSashEvent& event)
|
||||
{
|
||||
if (event.GetDragStatus() == wxSASH_STATUS_OUT_OF_RANGE)
|
||||
return;
|
||||
|
||||
switch (event.GetId())
|
||||
{
|
||||
case ID_LAYOUT_WINDOW_PROJECT:
|
||||
{
|
||||
wxGetApp().GetProjectSashWindow()->SetDefaultSize(wxSize(event.GetDragRect().width, 10000));
|
||||
break;
|
||||
}
|
||||
}
|
||||
wxLayoutAlgorithm layout;
|
||||
layout.LayoutMDIFrame(this);
|
||||
}
|
||||
|
||||
// Define the behaviour for the frame closing
|
||||
// - must delete all frames except for the main one.
|
||||
void csFrame::OnCloseWindow(wxCloseEvent& event)
|
||||
{
|
||||
int x, y;
|
||||
GetPosition(& x, & y);
|
||||
wxGetApp().m_mainFramePos = wxPoint(x, y);
|
||||
|
||||
GetSize(& x, & y);
|
||||
wxGetApp().m_mainFrameSize = wxSize(x, y);
|
||||
|
||||
wxDocMDIParentFrame::OnCloseWindow(event);
|
||||
}
|
||||
|
||||
void csFrame::OnSize(wxSizeEvent& event)
|
||||
{
|
||||
wxLayoutAlgorithm layout;
|
||||
layout.LayoutMDIFrame(this);
|
||||
}
|
||||
|
||||
// Make sure the correct toolbars are showing for the active view
|
||||
void csFrame::OnIdle(wxIdleEvent& event)
|
||||
{
|
||||
wxFrame::OnIdle(event);
|
||||
|
||||
wxSashLayoutWindow* paletteWin = wxGetApp().GetDiagramPaletteSashWindow();
|
||||
wxSashLayoutWindow* diagramToolBarWin = wxGetApp().GetDiagramToolBarSashWindow();
|
||||
if (!paletteWin || !diagramToolBarWin)
|
||||
return;
|
||||
bool doLayout = FALSE;
|
||||
if (GetActiveChild())
|
||||
{
|
||||
if (!paletteWin->IsShown() || !diagramToolBarWin->IsShown())
|
||||
{
|
||||
paletteWin->Show(TRUE);
|
||||
diagramToolBarWin->Show(TRUE);
|
||||
|
||||
doLayout = TRUE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (paletteWin->IsShown() || diagramToolBarWin->IsShown())
|
||||
{
|
||||
paletteWin->Show(FALSE);
|
||||
diagramToolBarWin->Show(FALSE);
|
||||
doLayout = TRUE;
|
||||
}
|
||||
}
|
||||
if (doLayout)
|
||||
{
|
||||
wxLayoutAlgorithm layout;
|
||||
layout.LayoutMDIFrame(this);
|
||||
}
|
||||
}
|
||||
|
||||
// General handler for disabling items
|
||||
void csFrame::OnUpdateDisable(wxUpdateUIEvent& event)
|
||||
{
|
||||
event.Enable(FALSE);
|
||||
}
|
||||
|
||||
void csFrame::OnSaveUpdate(wxUpdateUIEvent& event)
|
||||
{
|
||||
event.Enable( (GetActiveChild() != NULL) );
|
||||
}
|
||||
|
||||
/*
|
||||
* Child frame
|
||||
*/
|
||||
|
||||
BEGIN_EVENT_TABLE(csMDIChildFrame, wxDocMDIChildFrame)
|
||||
EVT_ACTIVATE(csMDIChildFrame::OnActivate)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
csMDIChildFrame::csMDIChildFrame(wxDocument* doc, wxView* view, wxMDIParentFrame *parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style):
|
||||
wxDocMDIChildFrame(doc, view, parent, id, title, pos, size, style)
|
||||
{
|
||||
// Accelerators
|
||||
wxAcceleratorEntry entries[18];
|
||||
|
||||
// Usual editing functions
|
||||
entries[0].Set(wxACCEL_NORMAL, WXK_DELETE, wxID_CLEAR);
|
||||
entries[1].Set(wxACCEL_CTRL, 'X', wxID_CUT);
|
||||
entries[2].Set(wxACCEL_CTRL, 'C', wxID_COPY);
|
||||
entries[3].Set(wxACCEL_SHIFT, WXK_INSERT, wxID_PASTE);
|
||||
entries[4].Set(wxACCEL_CTRL, 'V', wxID_PASTE);
|
||||
entries[5].Set(wxACCEL_CTRL, 'A', ID_CS_SELECT_ALL);
|
||||
|
||||
// Undo/redo
|
||||
entries[6].Set(wxACCEL_CTRL, 'Z', wxID_UNDO);
|
||||
entries[7].Set(wxACCEL_CTRL, 'Y', wxID_REDO);
|
||||
|
||||
// Other
|
||||
entries[8].Set(wxACCEL_NORMAL, WXK_RETURN, ID_CS_EDIT_PROPERTIES);
|
||||
entries[9].Set(wxACCEL_ALT, WXK_RETURN, ID_CS_EDIT_PROPERTIES);
|
||||
entries[10].Set(wxACCEL_CTRL, 'D', wxID_DUPLICATE);
|
||||
entries[11].Set(wxACCEL_NORMAL, WXK_F1, wxID_HELP);
|
||||
|
||||
// File handling
|
||||
entries[12].Set(wxACCEL_CTRL, 'S', wxID_SAVE);
|
||||
entries[13].Set(wxACCEL_NORMAL, WXK_F12, wxID_SAVEAS);
|
||||
entries[14].Set(wxACCEL_CTRL, 'O', wxID_OPEN);
|
||||
entries[15].Set(wxACCEL_CTRL, 'N', wxID_NEW);
|
||||
entries[16].Set(wxACCEL_CTRL, 'P', wxID_PRINT);
|
||||
entries[17].Set(wxACCEL_CTRL, 'W', wxID_CLOSE);
|
||||
|
||||
|
||||
wxAcceleratorTable accel(18, entries);
|
||||
SetAcceleratorTable(accel);
|
||||
}
|
||||
|
||||
void csMDIChildFrame::OnActivate(wxActivateEvent& event)
|
||||
{
|
||||
wxDocMDIChildFrame::OnActivate(event);
|
||||
/*
|
||||
wxSashLayoutWindow* win = wxGetApp().GetDiagramPaletteSashWindow();
|
||||
if (!win)
|
||||
return;
|
||||
|
||||
win->Show(event.GetActive());
|
||||
|
||||
wxLayoutAlgorithm layout;
|
||||
layout.LayoutMDIFrame((wxMDIParentFrame*) GetParent());
|
||||
*/
|
||||
}
|
||||
|
55
utils/ogl/samples/studio/mainfrm.h
Normal file
@ -0,0 +1,55 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: mainfrm.h
|
||||
// Purpose: Studio main window class
|
||||
// Author: Julian Smart
|
||||
// Modified by:
|
||||
// Created: 27/7/98
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) Julian Smart
|
||||
// Licence:
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _STUDIO_MAINFRM_H_
|
||||
#define _STUDIO_MAINFRM_H_
|
||||
|
||||
#include <wx/docmdi.h>
|
||||
|
||||
class wxSashLayoutWindow;
|
||||
class wxSashEvent;
|
||||
|
||||
class csFrame: public wxDocMDIParentFrame
|
||||
{
|
||||
public:
|
||||
csFrame(wxDocManager *manager, wxFrame *parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style);
|
||||
|
||||
void OnCloseWindow(wxCloseEvent& event);
|
||||
void OnSize(wxSizeEvent& event);
|
||||
void OnAbout(wxCommandEvent& event);
|
||||
void OnNewWindow(wxCommandEvent& event);
|
||||
void OnQuit(wxCommandEvent& event);
|
||||
void OnSashDragPaletteWindow(wxSashEvent& event);
|
||||
void OnSashDragProjectWindow(wxSashEvent& event);
|
||||
void OnIdle(wxIdleEvent& event);
|
||||
void OnHelp(wxCommandEvent& event);
|
||||
void OnSettings(wxCommandEvent& event);
|
||||
|
||||
// General handler for disabling items
|
||||
void OnUpdateDisable(wxUpdateUIEvent& event);
|
||||
void OnSaveUpdate(wxUpdateUIEvent& event);
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
class csMDIChildFrame: public wxDocMDIChildFrame
|
||||
{
|
||||
public:
|
||||
csMDIChildFrame(wxDocument* doc, wxView* view, wxMDIParentFrame *parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style);
|
||||
|
||||
void OnActivate(wxActivateEvent& event);
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
#endif
|
||||
// _STUDIO_MAINFRM_H_
|
||||
|
39
utils/ogl/samples/studio/makefile.unx
Normal file
@ -0,0 +1,39 @@
|
||||
#
|
||||
# File: makefile.unx
|
||||
# Author: Julian Smart
|
||||
# Created: 1998
|
||||
# Updated:
|
||||
# Copyright: (c) 1998 Julian Smart
|
||||
#
|
||||
# "%W% %G%"
|
||||
#
|
||||
# Makefile for OGL Studio (UNIX).
|
||||
|
||||
PROGRAM=studio
|
||||
|
||||
OBJECTS=$(PROGRAM).o doc.o shapes.o symbols.o view.o cspalette.o\
|
||||
mainfrm.o project.o dialogs.o csprint.o
|
||||
|
||||
EXTRACPPFLAGS=-I$(WXDIR)/utils/ogl/src
|
||||
EXTRALDLIBS=-logl$(GUISUFFIX)
|
||||
|
||||
WXDIR=/home/jacs/wx2
|
||||
|
||||
include $(WXDIR)/src/makeprog.env
|
||||
|
||||
cleanogl:
|
||||
cd $(WXDIR)/utils/ogl/src; make -f makefile.unx cleanmotif
|
||||
|
||||
ogl:
|
||||
cd $(WXDIR)/utils/ogl/src; make -f makefile.unx motif
|
||||
|
||||
wx:
|
||||
cd $(WXDIR)/src/motif; make -f makefile.unx motif
|
||||
|
||||
cleanwx:
|
||||
cd $(WXDIR)/src/motif; make -f makefile.unx cleanmotif
|
||||
|
||||
cleanall: cleanmotif cleanogl cleanwx
|
||||
|
||||
makeall: wx ogl motif
|
||||
|
143
utils/ogl/samples/studio/makefile.vc
Normal file
@ -0,0 +1,143 @@
|
||||
#
|
||||
# File: makefile.vc
|
||||
# Author: Julian Smart
|
||||
# Created: 1999
|
||||
# Updated:
|
||||
# Copyright: (c) Julian Smart
|
||||
#
|
||||
# "%W% %G%"
|
||||
#
|
||||
# Makefile : Builds OGL studio example (MS VC++).
|
||||
# Use FINAL=1 argument to nmake to build final version with no debugging
|
||||
# info
|
||||
|
||||
# Set WXDIR for your system
|
||||
WXDIR = $(WXWIN)
|
||||
WXUSINGDLL=0
|
||||
|
||||
STUDIODIR = $(WXDIR)\utils\ogl\samples\studio
|
||||
THISDIR = $(STUDIODIR)
|
||||
|
||||
OGLDIR = $(WXDIR)\utils\ogl
|
||||
OGLINC = $(OGLDIR)\src
|
||||
OGLLIB = $(WXDIR)\lib\ogl.lib
|
||||
|
||||
!include $(WXDIR)\src\makevc.env
|
||||
|
||||
EXTRALIBS=$(OGLLIB)
|
||||
EXTRAINC = /I$(OGLINC)
|
||||
|
||||
PROGRAM=studio
|
||||
|
||||
OBJECTS = $(PROGRAM).obj doc.obj shapes.obj symbols.obj view.obj cspalette.obj\
|
||||
mainfrm.obj project.obj dialogs.obj csprint.obj
|
||||
|
||||
all: wx ogl $(PROGRAM).exe
|
||||
|
||||
$(PROGRAM): $(PROGRAM).exe
|
||||
|
||||
cleanall: clean cleanogl # cleanidelib
|
||||
cleanutils: cleanall
|
||||
|
||||
wx:
|
||||
cd $(WXDIR)\src\msw
|
||||
nmake -f makefile.vc FINAL=$(FINAL)
|
||||
cd $(THISDIR)
|
||||
|
||||
cleanwx:
|
||||
cd $(WXDIR)\src\msw
|
||||
nmake -f makefile.vc clean
|
||||
cd $(THISDIR)
|
||||
|
||||
idelib:
|
||||
cd $(CLIPDIR)\IDELib\src
|
||||
nmake -f makefile.vc FINAL=$(FINAL)
|
||||
cd $(THISDIR)
|
||||
|
||||
cleanidelib:
|
||||
cd $(CLIPDIR)\IDELib\src
|
||||
nmake -f makefile.vc clean
|
||||
cd $(THISDIR)
|
||||
|
||||
ogl:
|
||||
cd $(OGLDIR)\src
|
||||
nmake -f makefile.vc FINAL=$(FINAL)
|
||||
cd $(THISDIR)
|
||||
|
||||
cleanogl:
|
||||
cd $(OGLDIR)\src
|
||||
nmake -f makefile.vc clean
|
||||
cd $(THISDIR)
|
||||
|
||||
$(PROGRAM).exe: $(DUMMYOBJ) $(WXLIB) $(OBJECTS) $(EXTRALIBS) $(PROGRAM).res
|
||||
$(link) @<<
|
||||
-out:$(PROGRAM).exe
|
||||
$(LINKFLAGS)
|
||||
$(DUMMYOBJ) $(OBJECTS) $(PROGRAM).res
|
||||
$(LIBS)
|
||||
<<
|
||||
|
||||
|
||||
$(PROGRAM).obj: $(PROGRAM).$(SRCSUFF) cspalette.h doc.h view.h $(DUMMYOBJ)
|
||||
$(cc) @<<
|
||||
$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
|
||||
<<
|
||||
|
||||
mainfrm.obj: mainfrm.$(SRCSUFF) mainfrm.h
|
||||
$(cc) @<<
|
||||
$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
|
||||
<<
|
||||
|
||||
cspalette.obj: cspalette.$(SRCSUFF) cspalette.h
|
||||
$(cc) @<<
|
||||
$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
|
||||
<<
|
||||
|
||||
project.obj: project.$(SRCSUFF) project.h
|
||||
$(cc) @<<
|
||||
$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
|
||||
<<
|
||||
|
||||
view.obj: view.$(SRCSUFF) view.h
|
||||
$(cc) @<<
|
||||
$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
|
||||
<<
|
||||
|
||||
doc.obj: doc.$(SRCSUFF) doc.h
|
||||
$(cc) @<<
|
||||
$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
|
||||
<<
|
||||
|
||||
shapes.obj: shapes.$(SRCSUFF) shapes.h
|
||||
$(cc) @<<
|
||||
$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
|
||||
<<
|
||||
|
||||
symbols.obj: symbols.$(SRCSUFF) symbols.h
|
||||
$(cc) @<<
|
||||
$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
|
||||
<<
|
||||
|
||||
dialogs.obj: dialogs.$(SRCSUFF) dialogs.h
|
||||
$(cc) @<<
|
||||
$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
|
||||
<<
|
||||
|
||||
csprint.obj: csprint.$(SRCSUFF) shapes.h
|
||||
$(cc) @<<
|
||||
$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
|
||||
<<
|
||||
|
||||
$(OBJECTS): shapes.h doc.h view.h mainfrm.h studio.h cspalette.h project.h symbols.h dialogs.h
|
||||
|
||||
$(PROGRAM).res : $(PROGRAM).rc $(WXDIR)\include\wx\msw\wx.rc
|
||||
$(rc) -r /i$(WXDIR)\include -fo$@ $(PROGRAM).rc
|
||||
|
||||
|
||||
clean:
|
||||
-erase *.obj
|
||||
-erase *.exe
|
||||
-erase *.res
|
||||
-erase *.map
|
||||
-erase *.sbr
|
||||
-erase *.pdb
|
BIN
utils/ogl/samples/studio/manual/BACK.GIF
Normal file
After Width: | Height: | Size: 225 B |
BIN
utils/ogl/samples/studio/manual/BULLET.BMP
Normal file
After Width: | Height: | Size: 138 B |
BIN
utils/ogl/samples/studio/manual/CONTENTS.GIF
Normal file
After Width: | Height: | Size: 231 B |
BIN
utils/ogl/samples/studio/manual/FORWARD.GIF
Normal file
After Width: | Height: | Size: 164 B |
29
utils/ogl/samples/studio/manual/Makefile
Normal file
@ -0,0 +1,29 @@
|
||||
#
|
||||
# File: Makefile
|
||||
# Author: Julian Smart
|
||||
# Created: 1998
|
||||
#
|
||||
# "%W% %G%"
|
||||
#
|
||||
# Makefile : Builds OGL Studio manual
|
||||
#
|
||||
|
||||
DOCDIR=.
|
||||
LOCALDOCDIR=.
|
||||
|
||||
DOCSOURCES=studio.tex
|
||||
|
||||
hlp: studio.hlp
|
||||
html: studio.htm
|
||||
rtf: studio.rtf
|
||||
|
||||
studio.hlp: studio.rtf studio.hpj
|
||||
-erase studio.ph
|
||||
hcw /E /C studio.hpj
|
||||
|
||||
studio.rtf: $(DOCSOURCES)
|
||||
-start /w tex2rtf studio.tex studio.rtf -twice -winhelp
|
||||
|
||||
studio.htm: $(DOCSOURCES)
|
||||
-start /w tex2rtf studio.tex studio.htm -twice -html
|
||||
|
20
utils/ogl/samples/studio/manual/Tex2rtf.ini
Normal file
@ -0,0 +1,20 @@
|
||||
; Tex2RTF initialisation file
|
||||
runTwice = yes
|
||||
titleFontSize = 12
|
||||
authorFontSize = 10
|
||||
chapterFontSize = 12
|
||||
sectionFontSize = 12
|
||||
subsectionFontSize = 12
|
||||
headerRule = yes
|
||||
footerRule = yes
|
||||
useHeadingStyles = yes
|
||||
contentsDepth = 2
|
||||
listItemIndent=40
|
||||
winHelpContents = yes
|
||||
winHelpVersion = 4 ; 3 for Windows 3.x, 4 for Windows 95
|
||||
winHelpTitle = "OGL Studio"
|
||||
generateHPJ = yes
|
||||
htmlBrowseButtons = bitmap
|
||||
truncateFilenames = yes
|
||||
htmlIndex = no
|
||||
htmlFrameContents = no
|
BIN
utils/ogl/samples/studio/manual/UP.GIF
Normal file
After Width: | Height: | Size: 137 B |
BIN
utils/ogl/samples/studio/manual/abacus.bmp
Normal file
After Width: | Height: | Size: 566 B |
BIN
utils/ogl/samples/studio/manual/alignb.bmp
Normal file
After Width: | Height: | Size: 238 B |
BIN
utils/ogl/samples/studio/manual/alignl.bmp
Normal file
After Width: | Height: | Size: 238 B |
BIN
utils/ogl/samples/studio/manual/alignr.bmp
Normal file
After Width: | Height: | Size: 238 B |
BIN
utils/ogl/samples/studio/manual/alignt.bmp
Normal file
After Width: | Height: | Size: 238 B |
BIN
utils/ogl/samples/studio/manual/arrow.bmp
Normal file
After Width: | Height: | Size: 382 B |
BIN
utils/ogl/samples/studio/manual/bitmap1.bmp
Normal file
After Width: | Height: | Size: 238 B |
BIN
utils/ogl/samples/studio/manual/bitmap2.bmp
Normal file
After Width: | Height: | Size: 238 B |
BIN
utils/ogl/samples/studio/manual/brush.bmp
Normal file
After Width: | Height: | Size: 740 B |
BIN
utils/ogl/samples/studio/manual/calc.bmp
Normal file
After Width: | Height: | Size: 702 B |
BIN
utils/ogl/samples/studio/manual/chart.bmp
Normal file
After Width: | Height: | Size: 600 B |
BIN
utils/ogl/samples/studio/manual/colour.bmp
Normal file
After Width: | Height: | Size: 734 B |
BIN
utils/ogl/samples/studio/manual/copy.bmp
Normal file
After Width: | Height: | Size: 238 B |
BIN
utils/ogl/samples/studio/manual/copysize.bmp
Normal file
After Width: | Height: | Size: 238 B |
BIN
utils/ogl/samples/studio/manual/cut.bmp
Normal file
After Width: | Height: | Size: 238 B |
BIN
utils/ogl/samples/studio/manual/cutpoint.bmp
Normal file
After Width: | Height: | Size: 238 B |
BIN
utils/ogl/samples/studio/manual/files.bmp
Normal file
After Width: | Height: | Size: 672 B |
BIN
utils/ogl/samples/studio/manual/help.bmp
Normal file
After Width: | Height: | Size: 238 B |
BIN
utils/ogl/samples/studio/manual/helpcs.bmp
Normal file
After Width: | Height: | Size: 238 B |
BIN
utils/ogl/samples/studio/manual/horiz.bmp
Normal file
After Width: | Height: | Size: 238 B |
BIN
utils/ogl/samples/studio/manual/linearrow.bmp
Normal file
After Width: | Height: | Size: 238 B |