/* -*- mode: C++; tab-width: 4; c-basic-offset: 4; -*- */ /* AbiSource Program Utilities * Copyright (C) 2002 Francis James Franklin * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ #include "ut_assert.h" #include "ut_debugmsg.h" #include "xap_CocoaWindow.h" static float s_ToolbarHeight = 0.0; @interface XAP_CocoaWindowDelegate : NSWindowController { XAP_CocoaWindow * m_window; } - (id)initWithWindow:(NSWindow *)window withXAPWindow:(XAP_CocoaWindow *)xap; - (void)windowDidResize:(NSNotification *)aNotification; @end @implementation XAP_CocoaWindowDelegate - (id)initWithWindow:(NSWindow *)window withXAPWindow:(XAP_CocoaWindow *)xap { if(![super initWithWindow:window]) { return nil; } m_window = xap; return self; } - (void)windowDidResize:(NSNotification *)aNotification { UT_UNUSED(aNotification); if (m_window) m_window->_windowResized (); } @end XAP_CocoaWindow::XAP_CocoaWindow (WindowStyle ws, const NSRect & frameRect) : m_styleMask(NSBorderlessWindowMask), m_backingType(NSBackingStoreBuffered), m_controller(0), m_window(0), m_isToolbar(false) { NSRect screenFrame = [[NSScreen mainScreen] visibleFrame]; float diff_width = screenFrame.size.width - frameRect.size.width; float diff_height = screenFrame.size.height - frameRect.size.height; m_frame = NSMakeRect (screenFrame.origin.x + diff_width / 2, screenFrame.origin.y + diff_height / 2, frameRect.size.width, frameRect.size.height); _init (ws); } XAP_CocoaWindow::XAP_CocoaWindow () : m_styleMask(NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask|NSResizableWindowMask), m_backingType(NSBackingStoreBuffered), m_controller(0), m_window(0), m_isToolbar(false) { NSRect frame = [[NSScreen mainScreen] visibleFrame]; float width = frame.size.width; float height = frame.size.height - s_ToolbarHeight; float x = width / 16.0; float y = height / 16.0; width -= width / 8.0; height -= height / 8.0; m_frame = NSMakeRect(x, y + height, width, height); _init (ws_Frame); } XAP_CocoaWindow::XAP_CocoaWindow (float height) : m_styleMask(NSBorderlessWindowMask), m_backingType(NSBackingStoreBuffered), m_controller(0), m_window(0), m_isToolbar(true) { m_frame = [[NSScreen mainScreen] visibleFrame]; m_frame.origin.y = m_frame.size.height - height; m_frame.size.height = height; _init (ws_Raw); s_ToolbarHeight = height; } void XAP_CocoaWindow::_init (WindowStyle ws) { switch (ws) { case ws_Raw: m_styleMask = NSBorderlessWindowMask; break; case ws_Normal: default: // ?? m_styleMask = NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask; break; } m_window = [[NSWindow alloc] initWithContentRect:m_frame styleMask:m_styleMask backing:m_backingType defer:YES]; UT_ASSERT (m_window);; m_controller = [[XAP_CocoaWindowDelegate alloc] initWithWindow:m_window withXAPWindow:this]; [m_window setDelegate:m_controller]; } XAP_CocoaWindow::~XAP_CocoaWindow () { if (m_controller) { [m_controller close]; } [m_controller release]; [m_window release]; if (m_isToolbar) s_ToolbarHeight = 0.0; } void XAP_CocoaWindow::_show () { UT_ASSERT(m_controller); if (m_controller == 0) return; [m_controller showWindow:m_controller]; // what object should we really be passing? [m_window setFrame:m_frame display:YES]; } /* assume that window position is top-left, not bottom-left */ void XAP_CocoaWindow::_moveto (const NSPoint & position) { [m_window setFrameTopLeftPoint:position]; } void XAP_CocoaWindow::_resize (const NSSize & size) { [m_window setContentSize:size]; } void XAP_CocoaWindow::_resize (float height) // special case for toolbar { if (!m_isToolbar) return; UT_ASSERT(m_window); if (m_window == 0) return; m_frame = [[NSScreen mainScreen] visibleFrame]; m_frame.origin.y = m_frame.size.height - height; m_frame.size.height = height; [m_window setContentSize:m_frame.size]; [m_window setFrame:m_frame display:YES]; s_ToolbarHeight = height; } /* callback notification of main-window resize */ void XAP_CocoaWindow::_windowResized () { // }