dock_frame.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:11k
- /*
- * ===========================================================================
- * PRODUCTION $Log: dock_frame.cpp,v $
- * PRODUCTION Revision 1000.1 2004/06/01 21:08:22 gouriano
- * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
- * PRODUCTION
- * ===========================================================================
- */
- /* $Id: dock_frame.cpp,v 1000.1 2004/06/01 21:08:22 gouriano Exp $
- * ===========================================================================
- *
- * PUBLIC DOMAIN NOTICE
- * National Center for Biotechnology Information
- *
- * This software/database is a "United States Government Work" under the
- * terms of the United States Copyright Act. It was written as part of
- * the author's official duties as a United States Government employee and
- * thus cannot be copyrighted. This software/database is freely available
- * to the public for use. The National Library of Medicine and the U.S.
- * Government have not placed any restriction on its use or reproduction.
- *
- * Although all reasonable efforts have been taken to ensure the accuracy
- * and reliability of the software and data, the NLM and the U.S.
- * Government do not and cannot warrant the performance or results that
- * may be obtained by using this software or data. The NLM and the U.S.
- * Government disclaim all warranties, express or implied, including
- * warranties of performance, merchantability or fitness for any particular
- * purpose.
- *
- * Please cite the author in any work or product based on this material.
- *
- * ===========================================================================
- *
- * Authors: Mike DiCuccio
- *
- * File Description:
- * CDockFrame -- internal widget class that represents the frame
- * surrounding a given MDI child
- */
- #include <ncbi_pch.hpp>
- #include "dock_frame.hpp"
- #include <FL/Fl_Box.H>
- #include <FL/Fl_Button.H>
- #include <FL/Fl_Pixmap.H>
- BEGIN_NCBI_SCOPE
- static void s_RedockLeft_cb(Fl_Widget* w, void* data)
- {
- CDockFrame* frame = reinterpret_cast<CDockFrame*>(data);
- if (frame) {
- frame->RedockLeft();
- }
- }
- static void s_RedockRight_cb(Fl_Widget* w, void* data)
- {
- CDockFrame* frame = reinterpret_cast<CDockFrame*>(data);
- if (frame) {
- frame->RedockRight();
- }
- }
- static void s_RedockBottom_cb(Fl_Widget* w, void* data)
- {
- CDockFrame* frame = reinterpret_cast<CDockFrame*>(data);
- if (frame) {
- frame->RedockBottom();
- }
- }
- static void s_RedockTop_cb(Fl_Widget* w, void* data)
- {
- CDockFrame* frame = reinterpret_cast<CDockFrame*>(data);
- if (frame) {
- frame->RedockTop();
- }
- }
- static void s_Remove_cb(Fl_Widget* w, void* data)
- {
- CDockFrame* frame = reinterpret_cast<CDockFrame*>(data);
- if (frame) {
- frame->Remove();
- }
- }
- CDockFrame::CDockFrame(CDockWidget* parent,
- int x, int y, int w, int h, const char* label)
- : Fl_Group(x, y, w, h, label)
- , m_Parent(parent)
- , m_Owner(false)
- {
- }
- CDockFrame::~CDockFrame()
- {
- // detach our child, if it exists
- Detach();
- }
- void CDockFrame::Attach(Fl_Widget* child, bool owner)
- {
- Detach();
- m_Child = child;
- m_Owner = owner;
- // our border
- const size_t border_h = 10;
- const size_t control_btn_w = 8;
- const size_t control_btn_h = 8;
- const size_t control_btn_spacing = 2;
- const size_t control_btn_panel_w = (control_btn_w+ control_btn_spacing) * 5;
- {{
- // our control group
- Fl_Box* box = NULL;
- Fl_Button* button = NULL;
- Fl_Group* group = new Fl_Group(x(), y(), w(), border_h);
- group->box(FL_FLAT_BOX);
- const size_t gripper_w = group->w() - 3 -
- (control_btn_panel_w + control_btn_spacing);
- const size_t gripper_h = 3;
- // gripper bars
- box = new Fl_Box(group->x() + 2, group->y() + 2,
- gripper_w, gripper_h);
- box->box(FL_THIN_UP_FRAME);
- box->clear_visible_focus();
- //group->add(box);
- group->resizable(box);
-
- box = new Fl_Box(group->x() + 2,
- group->y() + border_h - gripper_h - 2,
- gripper_w, gripper_h);
- box->box(FL_THIN_UP_FRAME);
- box->clear_visible_focus();
- //group->add(box);
- // buttons
- size_t control_x = group->x() + gripper_w + control_btn_spacing * 2;
- button = new Fl_Button(control_x, group->y() + 1,
- control_btn_w, control_btn_h);
- button->box(FL_THIN_UP_FRAME);
- button->image(x_GetDockPositionImg(CDockWidget::eDock_Left));
- button->clear_visible_focus();
- button->tooltip("Re-dock this window on the left");
- button->callback(s_RedockLeft_cb, this);
- control_x += control_btn_w + control_btn_spacing;
- button = new Fl_Button(control_x, group->y() + 1,
- control_btn_w, control_btn_h);
- button->box(FL_THIN_UP_FRAME);
- button->image(x_GetDockPositionImg(CDockWidget::eDock_Right));
- button->clear_visible_focus();
- button->callback(s_RedockRight_cb, this);
- button->tooltip("Re-dock this window on the right");
- control_x += control_btn_w + control_btn_spacing;
- button = new Fl_Button(control_x, group->y() + 1,
- control_btn_w, control_btn_h);
- button->box(FL_THIN_UP_FRAME);
- button->image(x_GetDockPositionImg(CDockWidget::eDock_Top));
- button->clear_visible_focus();
- button->callback(s_RedockTop_cb, this);
- button->tooltip("Re-dock this window on the top");
- control_x += control_btn_w + control_btn_spacing;
- button = new Fl_Button(control_x, group->y() + 1,
- control_btn_w, control_btn_h);
- button->box(FL_THIN_UP_FRAME);
- button->image(x_GetDockPositionImg(CDockWidget::eDock_Bottom));
- button->clear_visible_focus();
- button->callback(s_RedockBottom_cb, this);
- button->tooltip("Re-dock this window on the bottom");
- control_x += control_btn_w + control_btn_spacing;
- button = new Fl_Button(control_x, group->y() + 1,
- control_btn_w, control_btn_h);
- button->box(FL_THIN_UP_FRAME);
- button->image(x_GetDockCloseImg());
- button->clear_visible_focus();
- button->tooltip("Remove this view from the dock");
- control_x += control_btn_w + control_btn_spacing;
- //group->add
- group->end();
- add(group);
- }}
- if (m_Child) {
- m_Child->box(FL_THIN_DOWN_BOX);
- m_Child->resize(x(), y() + border_h, w(), h() + - border_h);
- add(m_Child);
- resizable(m_Child);
- }
- }
- void CDockFrame::Detach(void)
- {
- if (m_Child) {
- remove(m_Child);
- if (m_Owner) {
- delete m_Child;
- }
- }
- m_Child = NULL;
- m_Owner = false;
- }
- int CDockFrame::handle(int event)
- {
- return Fl_Group::handle(event);
- }
- void CDockFrame::x_Redock(CDockWidget::EDockPosition pos)
- {
- if (m_Parent) {
- bool old_owner = m_Owner;
- m_Owner = false;
- m_Parent->Undock(m_Child);
- m_Parent->Dock(m_Child, pos, old_owner);
- }
- }
- void CDockFrame::RedockLeft()
- {
- x_Redock(CDockWidget::eDock_Left);
- }
- void CDockFrame::RedockRight()
- {
- x_Redock(CDockWidget::eDock_Right);
- }
- void CDockFrame::RedockTop()
- {
- x_Redock(CDockWidget::eDock_Top);
- }
- void CDockFrame::RedockBottom()
- {
- x_Redock(CDockWidget::eDock_Bottom);
- }
- void CDockFrame::Remove()
- {
- }
- ////////////////////////////////////////////////////////////////////////////
- ///
- /// Control button images
- ///
- Fl_Pixmap* CDockFrame::sm_DockLeftImg = NULL;
- Fl_Pixmap* CDockFrame::sm_DockRightImg = NULL;
- Fl_Pixmap* CDockFrame::sm_DockTopImg = NULL;
- Fl_Pixmap* CDockFrame::sm_DockBottomImg = NULL;
- Fl_Pixmap* CDockFrame::sm_DockCloseImg = NULL;
- Fl_Pixmap* CDockFrame::x_GetDockPositionImg(CDockWidget::EDockPosition pos)
- {
- switch (pos) {
- case CDockWidget::eDock_Right:
- {{
- static const char * sc_DockRight[] = {
- "8 8 2 1",
- " c None",
- ". c #444040",
- " ",
- " . ",
- " .. ",
- " ... ",
- " ... ",
- " .. ",
- " . ",
- " "
- };
- if ( !sm_DockRightImg) {
- sm_DockRightImg = new Fl_Pixmap(sc_DockRight);
- }
- return sm_DockRightImg;
- }}
- break;
- case CDockWidget::eDock_Left:
- {{
- static const char * sc_DockLeft[] = {
- "8 8 2 1",
- " c None",
- ". c #444040",
- " ",
- " . ",
- " .. ",
- " ... ",
- " ... ",
- " .. ",
- " . ",
- " "
- };
- if ( !sm_DockLeftImg) {
- sm_DockLeftImg = new Fl_Pixmap(sc_DockLeft);
- }
- return sm_DockLeftImg;
- }}
- break;
- case CDockWidget::eDock_Bottom:
- {{
- static const char * sc_DockBottom[] = {
- "8 8 2 1",
- " c None",
- ". c #444040",
- " ",
- " ",
- " ...... ",
- " .... ",
- " .. ",
- " ",
- " ",
- " "
- };
- if ( !sm_DockBottomImg) {
- sm_DockBottomImg = new Fl_Pixmap(sc_DockBottom);
- }
- return sm_DockBottomImg;
- }}
- break;
- case CDockWidget::eDock_Top:
- {{
- static const char * sc_DockTop[] = {
- "8 8 2 1",
- " c None",
- ". c #444040",
- " ",
- " ",
- " .. ",
- " .... ",
- " ...... ",
- " ",
- " ",
- " "
- };
- if ( !sm_DockTopImg) {
- sm_DockTopImg = new Fl_Pixmap(sc_DockTop);
- }
- return sm_DockTopImg;
- }}
- break;
- default:
- LOG_POST(Error << "Error: unhandled dock image type");
- break;
- }
- return NULL;
- }
- Fl_Pixmap* CDockFrame::x_GetDockCloseImg(void)
- {
- static const char * sc_DockClose[] = {
- "8 8 3 1",
- " c None",
- "* c #444040",
- ". c #c0c0c0",
- " ",
- " *. .* ",
- " *..* ",
- " ** ",
- " ** ",
- " *..* ",
- " *. .* ",
- " "
- };
- if ( !sm_DockCloseImg) {
- sm_DockCloseImg = new Fl_Pixmap(sc_DockClose);
- }
- return sm_DockCloseImg;
- }
- END_NCBI_SCOPE
- /*
- * ===========================================================================
- * $Log: dock_frame.cpp,v $
- * Revision 1000.1 2004/06/01 21:08:22 gouriano
- * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
- *
- * Revision 1.2 2004/05/21 22:27:53 gorelenk
- * Added PCH ncbi_pch.hpp
- *
- * Revision 1.1 2004/01/08 16:45:31 dicuccio
- * Initial revision
- *
- * ===========================================================================
- */