diff --git a/BlueBerry/Bundles/org.blueberry.ui.qt/src/berryShell.h b/BlueBerry/Bundles/org.blueberry.ui.qt/src/berryShell.h
index 293c1a9f0c..f5cdedcf91 100644
--- a/BlueBerry/Bundles/org.blueberry.ui.qt/src/berryShell.h
+++ b/BlueBerry/Bundles/org.blueberry.ui.qt/src/berryShell.h
@@ -1,328 +1,328 @@
/*===================================================================
BlueBerry Platform
Copyright (c) German Cancer Research Center,
Division of Medical and Biological Informatics.
All rights reserved.
This software is distributed WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.
See LICENSE.txt or http://www.mitk.org for details.
===================================================================*/
#ifndef BERRYSHELL_H_
#define BERRYSHELL_H_
#include
#include
#include "berryIShellListener.h"
#include "guitk/berryGuiTkIControlListener.h"
namespace berry {
/**
* Instances of this class represent the "windows"
* which the desktop or "window manager" is managing.
* Instances that do not have a parent (that is, they
* are built using the constructor, which takes a
* Display
as the argument) are described
* as top level shells. Instances that do have
* a parent are described as secondary or
* dialog shells.
*
* Instances are always displayed in one of the maximized,
* minimized or normal states:
*
* -
* When an instance is marked as maximized, the
* window manager will typically resize it to fill the
* entire visible area of the display, and the instance
* is usually put in a state where it can not be resized
* (even if it has style
RESIZE
) until it is
* no longer maximized.
* -
* When an instance is in the normal state (neither
* maximized or minimized), its appearance is controlled by
* the style constants which were specified when it was created
* and the restrictions of the window manager (see below).
*
-
* When an instance has been marked as minimized,
* its contents (client area) will usually not be visible,
* and depending on the window manager, it may be
* "iconified" (that is, replaced on the desktop by a small
* simplified representation of itself), relocated to a
* distinguished area of the screen, or hidden. Combinations
* of these changes are also possible.
*
*
*
* The modality of an instance may be specified using
* style bits. The modality style bits are used to determine
* whether input is blocked for other shells on the display.
* The PRIMARY_MODAL
style allows an instance to block
* input to its parent. The APPLICATION_MODAL
style
* allows an instance to block input to every other shell in the
* display. The SYSTEM_MODAL
style allows an instance
* to block input to all shells, including shells belonging to
* different applications.
*
* Note: The styles supported by this class are treated
* as HINTs, since the window manager for the
* desktop on which the instance is visible has ultimate
* control over the appearance and behavior of decorations
* and modality. For example, some window managers only
* support resizable windows and will always assume the
* RESIZE style, even if it is not set. In addition, if a
* modality style is not supported, it is "upgraded" to a
* more restrictive modality style that is supported. For
* example, if PRIMARY_MODAL
is not supported,
* it would be upgraded to APPLICATION_MODAL
.
* A modality style may also be "downgraded" to a less
* restrictive style. For example, most operating systems
* no longer support SYSTEM_MODAL
because
* it can freeze up the desktop, so this is typically
* downgraded to APPLICATION_MODAL
.
*
* - Styles:
* - BORDER, CLOSE, MIN, MAX, NO_TRIM, RESIZE, TITLE, ON_TOP, TOOL
* - APPLICATION_MODAL, MODELESS, PRIMARY_MODAL, SYSTEM_MODAL
* - Events:
* - Activate, Close, Deactivate, Deiconify, Iconify
*
* Class SWT
provides two "convenience constants"
* for the most commonly required style combinations:
*
* SHELL_TRIM
* -
* the result of combining the constants which are required
* to produce a typical application top level shell: (that
* is,
CLOSE | TITLE | MIN | MAX | RESIZE
)
*
* DIALOG_TRIM
* -
* the result of combining the constants which are required
* to produce a typical application dialog shell: (that
* is,
TITLE | CLOSE | BORDER
)
*
*
*
*
* Note: Only one of the styles APPLICATION_MODAL, MODELESS,
* PRIMARY_MODAL and SYSTEM_MODAL may be specified.
*
* IMPORTANT: This class is not intended to be subclassed.
*
*/
class BERRY_UI_QT Shell : public virtual Object
{
public:
berryObjectMacro(Shell)
Shell();
Object::Pointer GetData(const QString& id = "") const;
void SetData(const Object::Pointer& data, const QString& id = "");
IShellListener* GetExtraShellListener() const;
void SetExtraShellListener(IShellListener* l);
void SetBounds(int x, int y, int width, int height);
virtual void SetBounds(const QRect& bounds) = 0;
virtual QRect GetBounds() const = 0;
virtual void SetLocation(int x, int y) = 0;
virtual QPoint ComputeSize(int wHint, int hHint, bool changed) = 0;
/**
* Returns the receiver's text, which is the string that the
* window manager will typically display as the receiver's title.
* If the text has not previously been set, returns an empty string.
*
* @return the text
*/
virtual QString GetText() const = 0;
/**
* Sets the receiver's text, which is the string that the window manager
* will typically display as the receiver's title, to the argument.
*/
virtual void SetText(const QString& text) = 0;
- virtual bool IsVisible() = 0;
+ virtual bool IsVisible() const = 0;
virtual void SetVisible(bool visible) = 0;
virtual QWidget* GetControl() = 0;
virtual void SetImages(const QList& images) = 0;
/**
* Returns true
if the receiver is currently
* maximized, and false otherwise.
*
*
* @return the maximized state
*
* @see #SetMaximized
*/
- virtual bool GetMaximized() = 0;
+ virtual bool GetMaximized() const = 0;
/**
* Returns true
if the receiver is currently
* minimized, and false otherwise.
*
*
* @return the minimized state
*
* @see #SetMinimized
*/
- virtual bool GetMinimized() = 0;
+ virtual bool GetMinimized() const = 0;
/**
* Sets the minimized stated of the receiver.
* If the argument is true
causes the receiver
* to switch to the minimized state, and if the argument is
* false
and the receiver was previously minimized,
* causes the receiver to switch back to either the maximized
* or normal states.
*
* Note: The result of intermixing calls to setMaximized(true)
* and setMinimized(true)
will vary by platform. Typically,
* the behavior will match the platform user's expectations, but not
* always. This should be avoided if possible.
*
*
* @param minimized the new maximized state
*
* @see #SetMaximized
*/
virtual void SetMinimized(bool minimized) = 0;
/**
* Sets the maximized state of the receiver.
* If the argument is true
causes the receiver
* to switch to the maximized state, and if the argument is
* false
and the receiver was previously maximized,
* causes the receiver to switch back to either the minimized
* or normal states.
*
* Note: The result of intermixing calls to setMaximized(true)
* and setMinimized(true)
will vary by platform. Typically,
* the behavior will match the platform user's expectations, but not
* always. This should be avoided if possible.
*
*
* @param maximized the new maximized state
*
* @see #SetMinimized
*/
virtual void SetMaximized(bool maximized) = 0;
/**
* Adds the listener to the collection of listeners who will
* be notified when operations are performed on the receiver,
* by sending the listener one of the messages defined in the
* IShellListener
interface.
*
* @param listener the listener which should be notified
*
* @see IShellListener
* @see #RemoveShellListener
*/
virtual void AddShellListener(IShellListener* listener) = 0;
/**
* Removes the listener from the collection of listeners who will
* be notified when operations are performed on the receiver.
*
* @param listener the listener which should no longer be notified
*
* @see IShellListener
* @see #AddShellListener
*/
virtual void RemoveShellListener(IShellListener* listener) = 0;
/**
* Moves the receiver to the top of the drawing order for
* the display on which it was created (so that all other
* shells on that display, which are not the receiver's
* children will be drawn behind it), marks it visible,
* sets the focus and asks the window manager to make the
* shell active.
*/
virtual void Open(bool block = false) = 0;
/**
* Requests that the window manager close the receiver in
* the same way it would be closed when the user clicks on
* the "close box" or performs some other platform specific
* key or mouse combination that indicates the window
* should be removed.
*/
virtual void Close() = 0;
/**
* If the receiver is visible, moves it to the top of the
* drawing order for the display on which it was created
* (so that all other shells on that display, which are not
* the receiver's children will be drawn behind it) and
* asks the window manager to make the shell active.
*/
virtual void SetActive() = 0;
/**
* Returns an array containing all shells which are
* descendants of the receiver.
*
* @return the dialog shells
*
* @exception SWTException
* - ERROR_WIDGET_DISPOSED - if the receiver has been disposed
* - ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
*
*/
virtual QList GetShells() = 0;
/**
* Returns the receiver's style information.
*
* Note that the value which is returned by this method may
* not match the value which was provided to the constructor
* when the receiver was created. This can occur when the underlying
* operating system does not support a particular combination of
* requested styles. For example, if the platform widget used to
* implement a particular SWT widget always has scroll bars, the
* result of calling this method would always have the
* SWT.H_SCROLL
and SWT.V_SCROLL
bits set.
*
*
* @return the style bits
*
* @exception SWTException
* - ERROR_WIDGET_DISPOSED - if the receiver has been disposed
* - ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
*
*/
virtual Qt::WindowFlags GetStyle () const = 0;
private:
QHash data;
IShellListener* extraShellListener;
};
}
Q_DECLARE_METATYPE(berry::Shell*)
#endif /* BERRYSHELL_H_ */
diff --git a/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryDetachedWindow.cpp b/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryDetachedWindow.cpp
index 8c236a418f..eb2fc44d83 100755
--- a/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryDetachedWindow.cpp
+++ b/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryDetachedWindow.cpp
@@ -1,540 +1,541 @@
/*===================================================================
BlueBerry Platform
Copyright (c) German Cancer Research Center,
Division of Medical and Biological Informatics.
All rights reserved.
This software is distributed WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.
See LICENSE.txt or http://www.mitk.org for details.
===================================================================*/
#include "tweaklets/berryGuiWidgetsTweaklet.h"
#include "berryDetachedWindow.h"
#include "berryIWorkbenchPartConstants.h"
#include "berryISaveablePart.h"
+#include "berryIContextService.h"
#include "berryWorkbenchWindow.h"
#include "berryWorkbenchConstants.h"
#include "berryEditorManager.h"
#include "berryDragUtil.h"
namespace berry
{
DetachedWindow::ShellListener::ShellListener(DetachedWindow* wnd) :
window(wnd)
{
}
void DetachedWindow::ShellListener::ShellClosed(const ShellEvent::Pointer& e)
{
// hold on to a reference of the DetachedWindow instance
// (otherwise, wnd->HandleClose() woulde delete the DetachedWindow
// instance too early, trying to write to members afterwards)
DetachedWindow::Pointer wnd(window);
// only continue to close if the handleClose
// wasn't canceled
e->doit = wnd->HandleClose();
}
DetachedWindow::ShellControlListener::ShellControlListener(DetachedWindow* wnd) :
window(wnd)
{
}
GuiTk::IControlListener::Events::Types DetachedWindow::ShellControlListener::GetEventTypes() const
{
return Events::RESIZED;
}
void DetachedWindow::ShellControlListener::ControlResized(
GuiTk::ControlEvent::Pointer e)
{
window->folder->SetBounds(
Tweaklets::Get(GuiWidgetsTweaklet::KEY)->GetClientArea(e->item));
}
DetachedWindow::DetachedWindow(WorkbenchPage* workbenchPage)
: folder(new PartStack(workbenchPage, false))
, page(workbenchPage)
, hideViewsOnClose(true)
, shellListener(new ShellListener(this))
, resizeListener(new ShellControlListener(this))
{
}
void DetachedWindow::PropertyChange(const Object::Pointer& /*source*/, int propId)
{
if (propId == IWorkbenchPartConstants::PROP_TITLE)
{
this->UpdateTitle();
}
else if (propId == PartStack::PROP_SELECTION)
{
this->ActivePartChanged(this->GetPartReference(folder->GetSelection()));
}
}
Shell::Pointer DetachedWindow::GetShell()
{
return windowShell;
}
void DetachedWindow::Create()
{
folder->AddListener(this);
windowShell
= page->GetWorkbenchWindow().Cast () ->GetDetachedWindowPool()->AllocateShell(
shellListener.data());
windowShell->SetData(Object::Pointer(this));
windowShell->SetText("");
DragUtil::AddDragTarget(windowShell->GetControl(), this);
hideViewsOnClose = true;
if (bounds.isEmpty())
{
QRect windowRect = page->GetWorkbenchWindow()->GetShell()->GetBounds();
QPoint center(windowRect.x() + windowRect.width() / 2, windowRect.y()
- windowRect.height() / 2);
bounds = QRect(center.x() - 150, center.y() + 100, 300, 200);
}
// Force the rect into the current display
QRect dispBounds =
Tweaklets::Get(GuiWidgetsTweaklet::KEY)->GetAvailableScreenSize();
if (bounds.width() > dispBounds.width())
bounds.setWidth(dispBounds.width());
if (bounds.height() > dispBounds.height())
bounds.setHeight(dispBounds.height());
if (bounds.x() + bounds.width() > dispBounds.width())
bounds.setX(dispBounds.width() - bounds.width());
if (bounds.y() + bounds.height() > dispBounds.height())
bounds.setY(dispBounds.height() - bounds.height());
this->GetShell()->SetBounds(bounds);
this->ConfigureShell(windowShell);
this->CreateContents(windowShell->GetControl());
//windowShell->Layout(true);
//folder->SetBounds(Tweaklets::Get(GuiWidgetsTweaklet::KEY)->GetClientArea(windowShell->GetControl()));
}
void DetachedWindow::Add(LayoutPart::Pointer part)
{
Shell::Pointer shell = this->GetShell();
if (shell != 0)
{
part->Reparent(shell->GetControl());
}
folder->Add(part);
this->UpdateMinimumSize();
}
bool DetachedWindow::BelongsToWorkbenchPage(
IWorkbenchPage::Pointer workbenchPage)
{
return (workbenchPage == this->page);
}
bool DetachedWindow::Close()
{
hideViewsOnClose = false;
Shell::Pointer shell = this->GetShell();
if (shell != 0)
{
shell->Close();
}
return true;
}
IDropTarget::Pointer DetachedWindow::Drag(QWidget* /*currentControl*/,
const Object::Pointer& draggedObject, const QPoint& position, const QRect& /*dragRectangle*/)
{
if (draggedObject.Cast () == 0)
{
return IDropTarget::Pointer(0);
}
PartPane::Pointer sourcePart = draggedObject.Cast ();
if (sourcePart->GetWorkbenchWindow() != page->GetWorkbenchWindow())
{
return IDropTarget::Pointer(0);
}
// Only handle the event if the source part is acceptable to the particular PartStack
IDropTarget::Pointer target;
if (folder->AllowsDrop(sourcePart))
{
target = folder->GetDropTarget(draggedObject, position);
if (target == 0)
{
QRect displayBounds =
DragUtil::GetDisplayBounds(folder->GetControl());
if (displayBounds.contains(position))
{
StackDropResult::Pointer stackDropResult(new StackDropResult(
displayBounds, Object::Pointer(0)));
target = folder->CreateDropTarget(sourcePart, stackDropResult);
}
else
{
return IDropTarget::Pointer(0);
}
}
}
return target;
}
ILayoutContainer::ChildrenType DetachedWindow::GetChildren() const
{
return folder->GetChildren();
}
WorkbenchPage::Pointer DetachedWindow::GetWorkbenchPage()
{
return WorkbenchPage::Pointer(this->page);
}
void DetachedWindow::RestoreState(IMemento::Pointer memento)
{
// Read the bounds.
int x = 0;
memento->GetInteger(WorkbenchConstants::TAG_X, x);
int y = 0;
memento->GetInteger(WorkbenchConstants::TAG_Y, y);
int width = 0;
memento->GetInteger(WorkbenchConstants::TAG_WIDTH, width);
int height = 0;
memento->GetInteger(WorkbenchConstants::TAG_HEIGHT, height);
// memento->GetInteger(WorkbenchConstants::TAG_FLOAT);
// Set the bounds.
bounds = QRect(x, y, width, height);
if (GetShell())
{
GetShell()->SetBounds(bounds);
}
// Create the folder.
IMemento::Pointer childMem =
memento->GetChild(WorkbenchConstants::TAG_FOLDER);
if (childMem)
{
folder->RestoreState(childMem);
}
}
void DetachedWindow::SaveState(IMemento::Pointer memento)
{
if (GetShell())
{
bounds = GetShell()->GetBounds();
}
// Save the bounds.
memento->PutInteger(WorkbenchConstants::TAG_X, bounds.x());
memento->PutInteger(WorkbenchConstants::TAG_Y, bounds.y());
memento->PutInteger(WorkbenchConstants::TAG_WIDTH, bounds.width());
memento->PutInteger(WorkbenchConstants::TAG_HEIGHT, bounds.height());
// Save the views.
IMemento::Pointer childMem = memento->CreateChild(
WorkbenchConstants::TAG_FOLDER);
folder->SaveState(childMem);
}
QWidget* DetachedWindow::GetControl()
{
return folder->GetControl();
}
int DetachedWindow::Open()
{
if (this->GetShell() == 0)
{
this->Create();
}
QRect bounds = this->GetShell()->GetBounds();
if (!(bounds == this->GetShell()->GetBounds()))
{
this->GetShell()->SetBounds(bounds);
}
this->GetShell()->SetVisible(true);
folder->SetBounds(Tweaklets::Get(GuiWidgetsTweaklet::KEY)->GetClientArea(this->GetShell()->GetControl()));
return 0;
}
void DetachedWindow::ActivePartChanged(
IWorkbenchPartReference::Pointer partReference)
{
if (activePart == partReference)
{
return;
}
if (activePart != 0)
{
activePart->RemovePropertyListener(this);
}
activePart = partReference;
if (partReference != 0)
{
partReference->AddPropertyListener(this);
}
this->UpdateTitle();
}
void DetachedWindow::ConfigureShell(Shell::Pointer shell)
{
this->UpdateTitle();
Tweaklets::Get(GuiWidgetsTweaklet::KEY)->AddControlListener(
shell->GetControl(), resizeListener);
//shell.addListener(SWT.Activate, activationListener);
//shell.addListener(SWT.Deactivate, activationListener);
//TODO DetachedWindow key bindings
- // // Register this detached view as a window (for key bindings).
- // IContextService contextService = (IContextService) getWorkbenchPage()
- // .getWorkbenchWindow().getWorkbench().getService(IContextService.class);
- // contextService.registerShell(shell, IContextService.TYPE_WINDOW);
- //
+ // Register this detached view as a window (for key bindings).
+ //IContextService* contextService = this->GetWorkbenchPage()->GetWorkbenchWindow()->
+ // GetWorkbench()->GetService();
+ //contextService->RegisterShell(shell, IContextService::TYPE_WINDOW);
+
// page.getWorkbenchWindow().getWorkbench().getHelpSystem().setHelp(shell,
// IWorkbenchHelpContextIds.DETACHED_WINDOW);
}
QWidget* DetachedWindow::CreateContents(QWidget* parent)
{
// Create the tab folder.
folder->CreateControl(parent);
// Reparent each view in the tab folder.
QList detachedChildren;
this->CollectViewPanes(detachedChildren, this->GetChildren());
for (QList::iterator itr = detachedChildren.begin(); itr
!= detachedChildren.end(); ++itr)
{
PartPane::Pointer part = *itr;
part->Reparent(parent);
}
//TODO DetachedWindow listen to folder events (update size?)
// if (folder->GetPresentation()
// instanceof TabbedStackPresentation)
// {
// TabbedStackPresentation stack = (TabbedStackPresentation) folder.getPresentation();
// AbstractTabFolder tabFolder = stack.getTabFolder();
// tabFolder.addListener(new TabFolderListener()
// {
// public void handleEvent(TabFolderEvent e)
// {
// switch (e.type)
// {
// case TabFolderEvent.EVENT_CLOSE:
// {
// updateMinimumSize();
// break;
// }
// case TabFolderEvent.EVENT_PREFERRED_SIZE:
// {
// updateMinimumSize();
// break;
// }
// }
// }
// });
// }
// Return tab folder control.
return folder->GetControl();
}
void DetachedWindow::UpdateTitle()
{
if (activePart != 0)
{
// Uncomment to set the shell title to match the title of the active part
// String text = activePart.getTitle();
//
// if (!text.equals(s.getText())) {
// s.setText(text);
// }
}
}
void DetachedWindow::UpdateMinimumSize()
{
// // We can only do this for 'Tabbed' stacked presentations.
// if (folder.getPresentation().Cast() != 0)
// {
// TabbedStackPresentation stack = (TabbedStackPresentation) folder.getPresentation();
//
// if (stack->GetPartList().size() == 1)
// {
// // Get the minimum space required for the part
// int width = stack->ComputePreferredSize(true, Constants::INF, Constants::INF, 0);
// int height = stack->ComputePreferredSize(false, Constants::INF, Constants::INF, 0);
//
// // Take the current shell 'trim' into account
// int shellHeight = windowShell->GetBounds().height - windowShell->GetClientArea().height;
// int shellWidth = windowShell->GetBounds().width - windowShell->GetClientArea().width;
//
// windowShell->SetMinimumSize(width + shellWidth, height + shellHeight);
// }
// }
}
IWorkbenchPartReference::Pointer DetachedWindow::GetPartReference(
LayoutPart::Pointer pane)
{
if (pane == 0 || pane.Cast () == 0)
{
return IWorkbenchPartReference::Pointer(0);
}
return pane.Cast ()->GetPartReference();
}
bool DetachedWindow::HandleClose()
{
if (hideViewsOnClose)
{
QList views;
this->CollectViewPanes(views, this->GetChildren());
// Save any dirty views
if (!this->HandleSaves(views))
{
return false; // User canceled the save
}
// OK, go on with the closing
for (QList::iterator itr = views.begin(); itr
!= views.end(); ++itr)
{
PartPane::Pointer child = *itr;
// Only close if closable...
if (child->IsCloseable())
{
page->HideView(child->GetPartReference().Cast ());
// Was the close cancelled?
if (child->GetContainer() != 0)
return false;
}
else
{
page->AttachView(child->GetPartReference().Cast ());
}
}
}
if (folder != 0)
{
folder->Dispose();
}
if (windowShell != 0)
{
Tweaklets::Get(GuiWidgetsTweaklet::KEY)->RemoveControlListener(
windowShell->GetControl(), resizeListener);
// windowShell.removeListener(SWT.Activate, activationListener);
// windowShell.removeListener(SWT.Deactivate, activationListener);
DragUtil::RemoveDragTarget(windowShell->GetControl(), this);
bounds = windowShell->GetBounds();
- //TODO DetachedWindow unregister key bindings
- // // Unregister this detached view as a window (for key bindings).
- // final IContextService contextService = (IContextService) getWorkbenchPage().getWorkbenchWindow().getWorkbench().getService(IContextService.class);
- // contextService.unregisterShell(windowShell);
+ // Unregister this detached view as a window (for key bindings).
+ //IContextService* contextService = this->GetWorkbenchPage()->GetWorkbenchWindow()->
+ // GetWorkbench()->GetService();
+ //contextService->UnregisterShell(windowShell);
windowShell->SetData(Object::Pointer(0));
windowShell = 0;
}
return true;
}
bool DetachedWindow::HandleSaves(QList views)
{
QList dirtyViews;
for (QList::iterator iterator = views.begin(); iterator
!= views.end(); ++iterator)
{
PartPane::Pointer pane = *iterator;
IViewReference::Pointer ref =
pane->GetPartReference().Cast ();
IViewPart::Pointer part = ref->GetView(false);
if (part.Cast () != 0)
{
ISaveablePart::Pointer saveable = part.Cast ();
if (saveable->IsDirty() && saveable->IsSaveOnCloseNeeded())
{
dirtyViews.push_back(part);
}
}
}
// If there are any prompt to save -before- any closing happens
// FIXME: This code will result in a double prompt if the user
// decides not to save a particular view at this stage they'll
// get a second one from the 'hideView' call...
if (dirtyViews.size() > 0)
{
IWorkbenchWindow::Pointer window = page->GetWorkbenchWindow();
bool success =
EditorManager::SaveAll(dirtyViews, true, true, false, window);
if (!success)
{
return false; // the user canceled.
}
}
return true;
}
void DetachedWindow::CollectViewPanes(QList& result,
const QList& parts)
{
for (QList::const_iterator iter = parts.begin(); iter
!= parts.end(); ++iter)
{
LayoutPart::Pointer part = *iter;
if (part.Cast () != 0)
{
result.push_back(part.Cast ());
}
}
}
}
diff --git a/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryPerspective.cpp b/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryPerspective.cpp
index 5343cb83ee..c59c886af9 100644
--- a/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryPerspective.cpp
+++ b/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryPerspective.cpp
@@ -1,1813 +1,1813 @@
/*===================================================================
BlueBerry Platform
Copyright (c) German Cancer Research Center,
Division of Medical and Biological Informatics.
All rights reserved.
This software is distributed WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.
See LICENSE.txt or http://www.mitk.org for details.
===================================================================*/
#include "tweaklets/berryGuiWidgetsTweaklet.h"
#include "berryPerspective.h"
#include "berryPerspectiveHelper.h"
#include "berryWorkbenchPlugin.h"
#include "berryWorkbenchConstants.h"
#include "berryPerspectiveExtensionReader.h"
#include "berryEditorSashContainer.h"
#include "berryPartSite.h"
#include "berryViewSite.h"
#include "berryEditorAreaHelper.h"
#include "intro/berryIntroConstants.h"
#include "berryWorkbenchWindow.h"
#include "berryStatusUtil.h"
#include "presentations/berryIStackPresentationSite.h"
+#include "berryIContextService.h"
#include
namespace berry
{
const QString Perspective::VERSION_STRING = "0.016";
Perspective::Perspective(PerspectiveDescriptor::Pointer desc,
WorkbenchPage::Pointer page)
: descriptor(desc)
{
this->Init(page);
if (desc.IsNotNull())
{
this->CreatePresentation(desc);
}
}
Perspective::Perspective(WorkbenchPage::Pointer page)
{
this->Init(page);
}
void Perspective::Init(WorkbenchPage::Pointer page)
{
editorHidden = false;
editorAreaState = IStackPresentationSite::STATE_RESTORED;
fixed = false;
presentation = 0;
shouldHideEditorsOnActivate = false;
this->page = page.GetPointer();
this->editorArea = page->GetEditorPresentation()->GetLayoutPart();
this->viewFactory = page->GetViewFactory();
}
bool Perspective::BringToTop(IViewReference::Pointer ref)
{
return presentation->BringPartToTop(this->GetPane(ref));
}
bool Perspective::ContainsView(IViewPart::Pointer view)
{
IViewSite::Pointer site = view->GetViewSite();
IViewReference::Pointer ref = this->FindView(site->GetId(), site->GetSecondaryId());
if (ref.IsNull())
{
return false;
}
return (view.Cast() == ref->GetPart(false));
}
bool Perspective::ContainsView(const QString& viewId) const
{
return mapIDtoViewLayoutRec.contains(viewId);
}
void Perspective::CreatePresentation(PerspectiveDescriptor::Pointer persp)
{
if (persp->HasCustomDefinition())
{
this->LoadCustomPersp(persp);
}
else
{
this->LoadPredefinedPersp(persp);
}
}
Perspective::~Perspective()
{
// Get rid of presentation.
if (presentation == 0)
{
DisposeViewRefs();
return;
}
presentation->Deactivate();
// Release each view.
QList refs(this->GetViewReferences());
for (QList::size_type i = 0, length = refs.size(); i < length; i++)
{
this->GetViewFactory()->ReleaseView(refs[i]);
}
mapIDtoViewLayoutRec.clear();
delete presentation;
}
void Perspective::DisposeViewRefs()
{
if (!memento)
{
return;
}
QList views(memento->GetChildren(WorkbenchConstants::TAG_VIEW));
for (int x = 0; x < views.size(); x++)
{
// Get the view details.
IMemento::Pointer childMem = views[x];
QString id; childMem->GetString(WorkbenchConstants::TAG_ID, id);
// skip creation of the intro reference - it's handled elsewhere.
if (id == IntroConstants::INTRO_VIEW_ID)
{
continue;
}
QString secondaryId = ViewFactory::ExtractSecondaryId(id);
if (!secondaryId.isEmpty())
{
id = ViewFactory::ExtractPrimaryId(id);
}
QString removed;
childMem->GetString(WorkbenchConstants::TAG_REMOVED, removed);
if (removed != "true")
{
IViewReference::Pointer ref = viewFactory->GetView(id, secondaryId);
if (ref)
{
viewFactory->ReleaseView(ref);
}
}
}
}
IViewReference::Pointer Perspective::FindView(const QString& viewId)
{
return this->FindView(viewId, "");
}
IViewReference::Pointer Perspective::FindView(const QString& id, const QString& secondaryId)
{
QList refs(this->GetViewReferences());
for (int i = 0; i < refs.size(); i++)
{
IViewReference::Pointer ref = refs[i];
if (id == ref->GetId()
&& (secondaryId == ref->GetSecondaryId()))
{
return ref;
}
}
return IViewReference::Pointer(0);
}
QWidget* Perspective::GetClientComposite()
{
return page->GetClientComposite();
}
IPerspectiveDescriptor::Pointer Perspective::GetDesc()
{
return descriptor;
}
PartPane::Pointer Perspective::GetPane(IViewReference::Pointer ref)
{
return ref.Cast()->GetPane();
}
QList Perspective::GetPerspectiveShortcuts()
{
return perspectiveShortcuts;
}
PerspectiveHelper* Perspective::GetPresentation() const
{
return presentation;
}
QList Perspective::GetShowViewShortcuts()
{
return showViewShortcuts;
}
ViewFactory* Perspective::GetViewFactory()
{
return viewFactory;
}
QList Perspective::GetViewReferences()
{
// Get normal views.
if (presentation == 0)
{
return QList();
}
QList panes;
presentation->CollectViewPanes(panes);
QList result;
// List fastViews = (fastViewManager != 0) ?
// fastViewManager.getFastViews(0)
// : new ArrayList();
// IViewReference[] resultArray = new IViewReference[panes.size()
// + fastViews.size()];
//
// // Copy fast views.
// int nView = 0;
// for (int i = 0; i < fastViews.size(); i++)
// {
// resultArray[nView] = (IViewReference) fastViews.get(i);
// ++nView;
// }
// Copy normal views.
for (QList::iterator iter = panes.begin();
iter != panes.end(); ++iter)
{
PartPane::Pointer pane = *iter;
result.push_back(pane->GetPartReference().Cast());
}
return result;
}
void Perspective::HideEditorArea()
{
if (!this->IsEditorAreaVisible())
{
return;
}
// Show the editor in the appropriate location
if (this->UseNewMinMax(Perspective::Pointer(this)))
{
// If it's the currently maximized part we have to restore first
// if (this->GetPresentation().getMaximizedStack().Cast() != 0)
// {
// getPresentation().getMaximizedStack().setState(IStackPresentationSite.STATE_RESTORED);
// }
bool isMinimized = editorAreaState == IStackPresentationSite::STATE_MINIMIZED;
if (!isMinimized)
this->HideEditorAreaLocal();
//else
// this->SetEditorAreaTrimVisibility(false);
}
else
{
this->HideEditorAreaLocal();
}
editorHidden = true;
}
void Perspective::HideEditorAreaLocal()
{
if (editorHolder != 0)
{
return;
}
// Replace the editor area with a placeholder so we
// know where to put it back on show editor area request.
editorHolder = new PartPlaceholder(editorArea->GetID());
presentation->GetLayout()->Replace(editorArea, editorHolder);
}
bool Perspective::HideView(IViewReference::Pointer ref)
{
// If the view is locked just return.
PartPane::Pointer pane = this->GetPane(ref);
presentation->RemovePart(pane);
// Dispose view if ref count == 0.
this->GetViewFactory()->ReleaseView(ref);
return true;
}
bool Perspective::IsEditorAreaVisible()
{
return !editorHidden;
}
ViewLayoutRec::Pointer Perspective::GetViewLayoutRec(IViewReference::Pointer ref, bool create)
{
ViewLayoutRec::Pointer result = this->GetViewLayoutRec(ViewFactory::GetKey(ref), create);
if (result.IsNull() && create==false)
{
result = this->GetViewLayoutRec(ref->GetId(), false);
}
return result;
}
ViewLayoutRec::Pointer Perspective::GetViewLayoutRec(const QString& viewId, bool create)
{
ViewLayoutRec::Pointer rec = mapIDtoViewLayoutRec[viewId];
if (rec.IsNull() && create)
{
rec = new ViewLayoutRec();
mapIDtoViewLayoutRec[viewId] = rec;
}
return rec;
}
bool Perspective::IsFixedLayout()
{
//@issue is there a difference between a fixed
//layout and a fixed perspective?? If not the API
//may need some polish, WorkbenchPage, PageLayout
//and Perspective all have isFixed methods.
//PageLayout and Perspective have their own fixed
//attribute, we are assuming they are always in sync.
//WorkbenchPage delegates to the perspective.
return fixed;
}
bool Perspective::IsStandaloneView(IViewReference::Pointer ref)
{
ViewLayoutRec::Pointer rec = this->GetViewLayoutRec(ref, false);
return rec.IsNotNull() && rec->isStandalone;
}
bool Perspective::GetShowTitleView(IViewReference::Pointer ref)
{
ViewLayoutRec::Pointer rec = this->GetViewLayoutRec(ref, false);
return rec.IsNotNull() && rec->showTitle;
}
void Perspective::LoadCustomPersp(PerspectiveDescriptor::Pointer persp)
{
//get the layout from the registry
PerspectiveRegistry* perspRegistry = dynamic_cast(WorkbenchPlugin::GetDefault()->GetPerspectiveRegistry());
try
{
IMemento::Pointer memento = perspRegistry->GetCustomPersp(persp->GetId());
// Restore the layout state.
// MultiStatus status = new MultiStatus(
// PlatformUI.PLUGIN_ID,
// IStatus.OK,
// NLS.bind(WorkbenchMessages.Perspective_unableToRestorePerspective, persp.getLabel()),
// 0);
// status.merge(restoreState(memento));
// status.merge(restoreState());
bool okay = true;
okay &= this->RestoreState(memento);
okay &= this->RestoreState();
if (!okay)
{
this->UnableToOpenPerspective(persp, "Unable to open perspective: " + persp->GetLabel());
}
}
//catch (IOException e)
//{
// unableToOpenPerspective(persp, 0);
//}
catch (const WorkbenchException& e)
{
this->UnableToOpenPerspective(persp, e.what());
}
}
void Perspective::UnableToOpenPerspective(PerspectiveDescriptor::Pointer persp,
const QString& status)
{
PerspectiveRegistry* perspRegistry = dynamic_cast(WorkbenchPlugin
::GetDefault()->GetPerspectiveRegistry());
perspRegistry->DeletePerspective(persp);
// If this is a predefined perspective, we will not be able to delete
// the perspective (we wouldn't want to). But make sure to delete the
// customized portion.
persp->DeleteCustomDefinition();
QString title = "Restoring problems";
QString msg = "Unable to read workbench state.";
if (status == "")
{
QMessageBox::critical(NULL, title, msg);
}
else
{
//TODO error dialog
//ErrorDialog.openError((Shell) 0, title, msg, status);
QMessageBox::critical(NULL, title, msg + "\n" + status);
}
}
void Perspective::LoadPredefinedPersp(PerspectiveDescriptor::Pointer persp)
{
// Create layout engine.
IPerspectiveFactory::Pointer factory;
try
{
factory = persp->CreateFactory();
}
catch (CoreException& /*e*/)
{
throw WorkbenchException("Unable to load perspective: " + persp->GetId());
}
/*
* IPerspectiveFactory#createFactory() can return 0
*/
if (factory == 0)
{
throw WorkbenchException("Unable to load perspective: " + persp->GetId());
}
// Create layout factory.
ViewSashContainer::Pointer container(new ViewSashContainer(page, this->GetClientComposite()));
layout = new PageLayout(container, this->GetViewFactory(),
editorArea, descriptor);
layout->SetFixed(descriptor->GetFixed());
// // add the placeholders for the sticky folders and their contents
IPlaceholderFolderLayout::Pointer stickyFolderRight, stickyFolderLeft, stickyFolderTop, stickyFolderBottom;
QList descs(WorkbenchPlugin::GetDefault()
->GetViewRegistry()->GetStickyViews());
for (int i = 0; i < descs.size(); i++)
{
IStickyViewDescriptor::Pointer stickyViewDescriptor = descs[i];
QString id = stickyViewDescriptor->GetId();
int location = stickyViewDescriptor->GetLocation();
if (location == IPageLayout::RIGHT)
{
if (stickyFolderRight == 0)
{
stickyFolderRight = layout
->CreatePlaceholderFolder(
StickyViewDescriptor::STICKY_FOLDER_RIGHT,
IPageLayout::RIGHT, .75f,
IPageLayout::ID_EDITOR_AREA);
}
stickyFolderRight->AddPlaceholder(id);
}
else if (location == IPageLayout::LEFT)
{
if (stickyFolderLeft == 0)
{
stickyFolderLeft = layout->CreatePlaceholderFolder(
StickyViewDescriptor::STICKY_FOLDER_LEFT,
IPageLayout::LEFT, .25f, IPageLayout::ID_EDITOR_AREA);
}
stickyFolderLeft->AddPlaceholder(id);
}
else if (location == IPageLayout::TOP)
{
if (stickyFolderTop == 0)
{
stickyFolderTop = layout->CreatePlaceholderFolder(
StickyViewDescriptor::STICKY_FOLDER_TOP,
IPageLayout::TOP, .25f, IPageLayout::ID_EDITOR_AREA);
}
stickyFolderTop->AddPlaceholder(id);
}
else if (location == IPageLayout::BOTTOM)
{
if (stickyFolderBottom == 0)
{
stickyFolderBottom = layout->CreatePlaceholderFolder(
StickyViewDescriptor::STICKY_FOLDER_BOTTOM,
IPageLayout::BOTTOM, .75f,
IPageLayout::ID_EDITOR_AREA);
}
stickyFolderBottom->AddPlaceholder(id);
}
//should never be 0 as we've just added the view above
IViewLayout::Pointer viewLayout = layout->GetViewLayout(id);
viewLayout->SetCloseable(stickyViewDescriptor->IsCloseable());
viewLayout->SetMoveable(stickyViewDescriptor->IsMoveable());
}
// Run layout engine.
factory->CreateInitialLayout(layout);
PerspectiveExtensionReader extender;
extender.ExtendLayout(descriptor->GetId(), layout);
// Retrieve view layout info stored in the page layout.
QHash layoutInfo = layout->GetIDtoViewLayoutRecMap();
mapIDtoViewLayoutRec.unite(layoutInfo);
//TODO Perspective action sets
// Create action sets.
//List temp = new ArrayList();
//this->CreateInitialActionSets(temp, layout.getActionSets());
-// IContextService service = 0;
+// IContextService* service = 0;
// if (page != 0)
// {
-// service = (IContextService) page.getWorkbenchWindow().getService(
-// IContextService.class);
+// service = page->GetWorkbenchWindow()->GetService();
// }
// try
// {
-// if (service!=0)
+// if (service != 0)
// {
-// service.activateContext(ContextAuthority.DEFER_EVENTS);
+// service->DeferUpdates(true);
// }
// for (Iterator iter = temp.iterator(); iter.hasNext();)
// {
// IActionSetDescriptor descriptor = (IActionSetDescriptor) iter
// .next();
// addAlwaysOn(descriptor);
// }
// }finally
// {
// if (service!=0)
// {
// service.activateContext(ContextAuthority.SEND_EVENTS);
// }
// }
// newWizardShortcuts = layout.getNewWizardShortcuts();
showViewShortcuts = layout->GetShowViewShortcuts();
// perspectiveShortcuts = layout.getPerspectiveShortcuts();
// showInPartIds = layout.getShowInPartIds();
//
// // Retrieve fast views
// if (fastViewManager != 0)
// {
// ArrayList fastViews = layout.getFastViews();
// for (Iterator fvIter = fastViews.iterator(); fvIter.hasNext();)
// {
// IViewReference ref = (IViewReference) fvIter.next();
// fastViewManager.addViewReference(FastViewBar.FASTVIEWBAR_ID, -1, ref,
// !fvIter.hasNext());
// }
// }
// Is the layout fixed
fixed = layout->IsFixed();
showViewShortcuts = layout->GetShowViewShortcuts();
// Create presentation.
presentation = new PerspectiveHelper(page, container, this);
// Hide editor area if requested by factory
if (!layout->IsEditorAreaVisible())
{
this->HideEditorArea();
}
}
void Perspective::OnActivate()
{
// Update editor area state.
if (editorArea->GetControl() != 0)
{
bool visible = this->IsEditorAreaVisible();
bool inTrim = editorAreaState == IStackPresentationSite::STATE_MINIMIZED;
editorArea->SetVisible(visible && !inTrim);
}
// // Update fast views.
// // Make sure the control for the fastviews are created so they can
// // be activated.
// if (fastViewManager != 0)
// {
// List fastViews = fastViewManager.getFastViews(0);
// for (int i = 0; i < fastViews.size(); i++)
// {
// ViewPane pane = getPane((IViewReference) fastViews.get(i));
// if (pane != 0)
// {
// Control ctrl = pane.getControl();
// if (ctrl == 0)
// {
// pane.createControl(getClientComposite());
// ctrl = pane.getControl();
// }
// ctrl.setEnabled(false); // Remove focus support.
// }
// }
// }
// // Set the visibility of all fast view pins
// setAllPinsVisible(true);
// Trim Stack Support
bool useNewMinMax = Perspective::UseNewMinMax(Perspective::Pointer(this));
bool hideEditorArea = shouldHideEditorsOnActivate || (editorHidden && editorHolder == 0);
// We have to set the editor area's stack state -before-
// activating the presentation since it's used there to determine
// size of the resulting stack
if (useNewMinMax && !hideEditorArea)
{
this->RefreshEditorAreaVisibility();
}
// Show the layout
presentation->Activate(this->GetClientComposite());
// if (useNewMinMax)
// {
// fastViewManager.activate();
//
// // Move any minimized extension stacks to the trim
// if (layout != 0)
// {
// // Turn aimations off
// IPreferenceStore preferenceStore = PrefUtil.getAPIPreferenceStore();
// bool useAnimations = preferenceStore
// .getbool(IWorkbenchPreferenceConstants.ENABLE_ANIMATIONS);
// preferenceStore.setValue(IWorkbenchPreferenceConstants.ENABLE_ANIMATIONS, false);
//
// List minStacks = layout.getMinimizedStacks();
// for (Iterator msIter = minStacks.iterator(); msIter.hasNext();)
// {
// ViewStack vs = (ViewStack) msIter.next();
// vs.setMinimized(true);
// }
//
// // Restore the animation pref
// preferenceStore.setValue(IWorkbenchPreferenceConstants.ENABLE_ANIMATIONS, useAnimations);
//
// // this is a one-off deal...set during the extension reading
// minStacks.clear();
// layout = 0;
// }
// }
// else
// {
// // Update the FVB only if not using the new min/max
//
// // WorkbenchWindow wbw = (WorkbenchWindow) page.getWorkbenchWindow();
//// if (wbw != 0)
//// {
//// ITrimManager tbm = wbw.getTrimManager();
//// if (tbm != 0)
//// {
//// IWindowTrim fvb = tbm.getTrim(FastViewBar.FASTVIEWBAR_ID);
//// if (fvb instanceof FastViewBar)
//// {
//// ((FastViewBar)fvb).update(true);
//// }
//// }
//// }
// }
// // If we are -not- using the new min/max then ensure that there
// // are no stacks in the trim. This can happen when a user switches
// // back to the 3.0 presentation...
// if (!Perspective.useNewMinMax(this) && fastViewManager != 0)
// {
// bool stacksWereRestored = fastViewManager.restoreAllTrimStacks();
// setEditorAreaTrimVisibility(false);
//
// // Restore any 'maximized' view stack since we've restored
// // the minimized stacks
// if (stacksWereRestored && presentation.getMaximizedStack().Cast() != 0)
// {
// ViewStack vs = (ViewStack) presentation.getMaximizedStack();
// vs.setPresentationState(IStackPresentationSite.STATE_RESTORED);
// presentation.setMaximizedStack(0);
// }
// }
// We hide the editor area -after- the presentation activates
if (hideEditorArea)
{
// We do this here to ensure that createPartControl is called on the
// top editor
// before it is hidden. See bug 20166.
this->HideEditorArea();
shouldHideEditorsOnActivate = false;
// // this is an override so it should handle both states
// if (useNewMinMax)
// setEditorAreaTrimVisibility(editorAreaState == IStackPresentationSite.STATE_MINIMIZED);
}
FixOrphan();
}
void Perspective::FixOrphan()
{
PerspectiveRegistry* reg = static_cast(PlatformUI::GetWorkbench()->GetPerspectiveRegistry());
IPerspectiveDescriptor::Pointer regDesc = reg->FindPerspectiveWithId(descriptor->GetId());
if (regDesc.IsNull())
{
QString msg = "Perspective " + descriptor->GetLabel() + " has been made into a local copy";
IStatus::Pointer status = StatusUtil::NewStatus(IStatus::WARNING_TYPE, msg, BERRY_STATUS_LOC);
//StatusManager.getManager().handle(status, StatusManager.LOG);
WorkbenchPlugin::Log(status);
QString localCopyLabel("<%1>");
QString newDescId = localCopyLabel.arg(descriptor->GetLabel());
while (reg->FindPerspectiveWithId(newDescId).IsNotNull())
{
newDescId = localCopyLabel.arg(newDescId);
}
IPerspectiveDescriptor::Pointer newDesc = reg->CreatePerspective(newDescId, descriptor);
page->SavePerspectiveAs(newDesc);
}
}
void Perspective::OnDeactivate()
{
presentation->Deactivate();
//setActiveFastView(0);
//setAllPinsVisible(false);
// // Update fast views.
// if (fastViewManager != 0)
// {
// List fastViews = fastViewManager.getFastViews(0);
// for (int i = 0; i < fastViews.size(); i++)
// {
// ViewPane pane = getPane((IViewReference) fastViews.get(i));
// if (pane != 0)
// {
// Control ctrl = pane.getControl();
// if (ctrl != 0)
// {
// ctrl.setEnabled(true); // Add focus support.
// }
// }
// }
//
// fastViewManager.deActivate();
// }
//
// // Ensure that the editor area trim is hidden as well
// setEditorAreaTrimVisibility(false);
}
void Perspective::PartActivated(IWorkbenchPart::Pointer /*activePart*/)
{
// // If a fastview is open close it.
// if (activeFastView != 0
// && activeFastView.getPart(false) != activePart)
// {
// setActiveFastView(0);
// }
}
void Perspective::PerformedShowIn(const QString& /*partId*/)
{
//showInTimes.insert(std::make_pair(partId, new Long(System.currentTimeMillis())));
}
bool Perspective::RestoreState(IMemento::Pointer memento)
{
// MultiStatus result = new MultiStatus(
// PlatformUI.PLUGIN_ID,
// IStatus.OK,
// WorkbenchMessages.Perspective_problemsRestoringPerspective, 0);
bool result = true;
// Create persp descriptor.
descriptor = new PerspectiveDescriptor("", "", PerspectiveDescriptor::Pointer(0));
//result.add(descriptor.restoreState(memento));
result &= descriptor->RestoreState(memento);
PerspectiveDescriptor::Pointer desc = WorkbenchPlugin::GetDefault()->
GetPerspectiveRegistry()->FindPerspectiveWithId(descriptor->GetId()).Cast();
if (desc)
{
descriptor = desc;
}
else
{
try
{
WorkbenchPlugin::GetDefault()->GetPerspectiveRegistry()->CreatePerspective(descriptor->GetLabel(), descriptor.Cast());
}
catch (...)
{
std::cout << "Perspective could not be loaded" << std::endl;
}
}
this->memento = memento;
// Add the visible views.
QList views(memento->GetChildren(WorkbenchConstants::TAG_VIEW));
//result.merge(createReferences(views));
result &= this->CreateReferences(views);
memento = memento->GetChild(WorkbenchConstants::TAG_FAST_VIEWS);
if (memento)
{
views = memento->GetChildren(WorkbenchConstants::TAG_VIEW);
//result.merge(createReferences(views));
result &= this->CreateReferences(views);
}
return result;
}
bool Perspective::CreateReferences(const QList& views)
{
// MultiStatus result = new MultiStatus(PlatformUI.PLUGIN_ID, IStatus.OK,
// WorkbenchMessages.Perspective_problemsRestoringViews, 0);
bool result = true;
for (int x = 0; x < views.size(); x++)
{
// Get the view details.
IMemento::Pointer childMem = views[x];
QString id; childMem->GetString(WorkbenchConstants::TAG_ID, id);
// skip creation of the intro reference - it's handled elsewhere.
if (id == IntroConstants::INTRO_VIEW_ID)
{
continue;
}
QString secondaryId(ViewFactory::ExtractSecondaryId(id));
if (!secondaryId.isEmpty())
{
id = ViewFactory::ExtractPrimaryId(id);
}
// Create and open the view.
try
{
QString rm; childMem->GetString(WorkbenchConstants::TAG_REMOVED, rm);
if (rm != "true")
{
viewFactory->CreateView(id, secondaryId);
}
}
catch (const PartInitException& e)
{
childMem->PutString(WorkbenchConstants::TAG_REMOVED, "true");
// result.add(StatusUtil.newStatus(IStatus.ERR,
// e.getMessage() == 0 ? "" : e.getMessage(), //$NON-NLS-1$
// e));
WorkbenchPlugin::Log(e.what(), e);
result &= true;
}
}
return result;
}
bool Perspective::RestoreState()
{
if (this->memento == 0)
{
//return new Status(IStatus.OK, PlatformUI.PLUGIN_ID, 0, "", 0); //$NON-NLS-1$
return true;
}
// MultiStatus result = new MultiStatus(
// PlatformUI.PLUGIN_ID,
// IStatus.OK,
// WorkbenchMessages.Perspective_problemsRestoringPerspective, 0);
bool result = true;
IMemento::Pointer memento = this->memento;
this->memento = 0;
const IMemento::Pointer boundsMem(memento->GetChild(WorkbenchConstants::TAG_WINDOW));
if (boundsMem)
{
int x, y, w, h;
boundsMem->GetInteger(WorkbenchConstants::TAG_X, x);
boundsMem->GetInteger(WorkbenchConstants::TAG_Y, y);
boundsMem->GetInteger(WorkbenchConstants::TAG_HEIGHT, h);
boundsMem->GetInteger(WorkbenchConstants::TAG_WIDTH, w);
QRect r(x, y, w, h);
//StartupThreading.runWithoutExceptions(new StartupRunnable()
// {
// void runWithException() throws Throwable
// {
if (page->GetWorkbenchWindow()->GetActivePage() == 0)
{
page->GetWorkbenchWindow()->GetShell()->SetBounds(r);
}
// }
// });
}
// Create an empty presentation..
PerspectiveHelper* pres;
//StartupThreading.runWithoutExceptions(new StartupRunnable()
// {
// void runWithException() throws Throwable
// {
ViewSashContainer::Pointer mainLayout(new ViewSashContainer(page, this->GetClientComposite()));
pres = new PerspectiveHelper(page, mainLayout, this);
// }});
// Read the layout.
// result.merge(pres.restoreState(memento
// .getChild(IWorkbenchConstants.TAG_LAYOUT)));
result &= pres->RestoreState(memento->GetChild(WorkbenchConstants::TAG_LAYOUT));
//StartupThreading.runWithoutExceptions(new StartupRunnable()
// {
// void runWithException() throws Throwable
// {
// Add the editor workbook. Do not hide it now.
pres->ReplacePlaceholderWithPart(editorArea);
// }});
// Add the visible views.
QList views(memento->GetChildren(WorkbenchConstants::TAG_VIEW));
for (int x = 0; x < views.size(); x++)
{
// Get the view details.
IMemento::Pointer childMem = views[x];
QString id; childMem->GetString(WorkbenchConstants::TAG_ID, id);
QString secondaryId(ViewFactory::ExtractSecondaryId(id));
if (!secondaryId.isEmpty())
{
id = ViewFactory::ExtractPrimaryId(id);
}
// skip the intro as it is restored higher up in workbench.
if (id == IntroConstants::INTRO_VIEW_ID)
{
continue;
}
// Create and open the view.
IViewReference::Pointer viewRef = viewFactory->GetView(id, secondaryId);
WorkbenchPartReference::Pointer ref = viewRef.Cast();
// report error
if (ref == 0)
{
QString key = ViewFactory::GetKey(id, secondaryId);
// result.add(new Status(IStatus.ERR, PlatformUI.PLUGIN_ID, 0,
// NLS.bind(WorkbenchMessages.Perspective_couldNotFind, key ), 0));
WorkbenchPlugin::Log("Could not find view: " + key);
continue;
}
bool willPartBeVisible = pres->WillPartBeVisible(ref->GetId(), secondaryId);
if (willPartBeVisible)
{
IViewPart::Pointer view = ref->GetPart(true).Cast();
if (view)
{
ViewSite::Pointer site = view->GetSite().Cast();
pres->ReplacePlaceholderWithPart(site->GetPane().Cast());
}
}
else
{
pres->ReplacePlaceholderWithPart(ref->GetPane());
}
}
// // Load the fast views
// if (fastViewManager != 0)
// fastViewManager.restoreState(memento, result);
// Load the view layout recs
QList recMementos(memento
->GetChildren(WorkbenchConstants::TAG_VIEW_LAYOUT_REC));
for (int i = 0; i < recMementos.size(); i++)
{
IMemento::Pointer recMemento = recMementos[i];
QString compoundId;
if (recMemento->GetString(WorkbenchConstants::TAG_ID, compoundId))
{
ViewLayoutRec::Pointer rec = GetViewLayoutRec(compoundId, true);
QString closeablestr; recMemento->GetString(WorkbenchConstants::TAG_CLOSEABLE, closeablestr);
if (WorkbenchConstants::FALSE_VAL == closeablestr)
{
rec->isCloseable = false;
}
QString moveablestr; recMemento->GetString(WorkbenchConstants::TAG_MOVEABLE, moveablestr);
if (WorkbenchConstants::FALSE_VAL == moveablestr)
{
rec->isMoveable = false;
}
QString standalonestr; recMemento->GetString(WorkbenchConstants::TAG_STANDALONE, standalonestr);
if (WorkbenchConstants::TRUE_VAL == standalonestr)
{
rec->isStandalone = true;
QString showstr; recMemento->GetString(WorkbenchConstants::TAG_SHOW_TITLE, showstr);
rec->showTitle = WorkbenchConstants::FALSE_VAL != showstr;
}
}
}
//final IContextService service = (IContextService)page.getWorkbenchWindow().getService(IContextService.class);
try
{ // one big try block, don't kill me here
// // defer context events
// if (service != 0)
// {
// service.activateContext(ContextAuthority.DEFER_EVENTS);
// }
//
// HashSet knownActionSetIds = new HashSet();
//
// // Load the always on action sets.
QList actions; // = memento
// .getChildren(IWorkbenchConstants.TAG_ALWAYS_ON_ACTION_SET);
// for (int x = 0; x < actions.length; x++)
// {
// String actionSetID = actions[x]
// .getString(IWorkbenchConstants.TAG_ID);
// final IActionSetDescriptor d = WorkbenchPlugin.getDefault()
// .getActionSetRegistry().findActionSet(actionSetID);
// if (d != 0)
// {
// StartupThreading
// .runWithoutExceptions(new StartupRunnable()
// {
// void runWithException() throws Throwable
// {
// addAlwaysOn(d);
// }
// });
//
// knownActionSetIds.add(actionSetID);
// }
// }
//
// // Load the always off action sets.
// actions = memento
// .getChildren(IWorkbenchConstants.TAG_ALWAYS_OFF_ACTION_SET);
// for (int x = 0; x < actions.length; x++)
// {
// String actionSetID = actions[x]
// .getString(IWorkbenchConstants.TAG_ID);
// final IActionSetDescriptor d = WorkbenchPlugin.getDefault()
// .getActionSetRegistry().findActionSet(actionSetID);
// if (d != 0)
// {
// StartupThreading
// .runWithoutExceptions(new StartupRunnable()
// {
// void runWithException() throws Throwable
// {
// addAlwaysOff(d);
// }
// });
// knownActionSetIds.add(actionSetID);
// }
// }
// Load "show view actions".
actions = memento->GetChildren(WorkbenchConstants::TAG_SHOW_VIEW_ACTION);
for (int x = 0; x < actions.size(); x++)
{
QString id; actions[x]->GetString(WorkbenchConstants::TAG_ID, id);
showViewShortcuts.push_back(id);
}
// // Load "show in times".
// actions = memento.getChildren(IWorkbenchConstants.TAG_SHOW_IN_TIME);
// for (int x = 0; x < actions.length; x++)
// {
// String id = actions[x].getString(IWorkbenchConstants.TAG_ID);
// String timeStr = actions[x]
// .getString(IWorkbenchConstants.TAG_TIME);
// if (id != 0 && timeStr != 0)
// {
// try
// {
// long time = Long.parseLong(timeStr);
// showInTimes.put(id, new Long(time));
// }
// catch (NumberFormatException e)
// {
// // skip this one
// }
// }
// }
// Load "show in parts" from registry, not memento
showInPartIds = this->GetShowInIdsFromRegistry();
// // Load "new wizard actions".
// actions = memento
// .getChildren(IWorkbenchConstants.TAG_NEW_WIZARD_ACTION);
// newWizardShortcuts = new ArrayList(actions.length);
// for (int x = 0; x < actions.length; x++)
// {
// String id = actions[x].getString(IWorkbenchConstants.TAG_ID);
// newWizardShortcuts.add(id);
// }
// Load "perspective actions".
actions = memento->GetChildren(WorkbenchConstants::TAG_PERSPECTIVE_ACTION);
for (int x = 0; x < actions.size(); x++)
{
QString id; actions[x]->GetString(WorkbenchConstants::TAG_ID, id);
perspectiveShortcuts.push_back(id);
}
// ArrayList extActionSets = getPerspectiveExtensionActionSets();
// for (int i = 0; i < extActionSets.size(); i++)
// {
// String actionSetID = (String) extActionSets.get(i);
// if (knownActionSetIds.contains(actionSetID))
// {
// continue;
// }
// final IActionSetDescriptor d = WorkbenchPlugin.getDefault()
// .getActionSetRegistry().findActionSet(actionSetID);
// if (d != 0)
// {
// StartupThreading
// .runWithoutExceptions(new StartupRunnable()
// {
// void runWithException() throws Throwable
// {
// addAlwaysOn(d);
// }
// });
// knownActionSetIds.add(d.getId());
// }
// }
// // Add the visible set of action sets to our knownActionSetIds
// // Now go through the registry to ensure we pick up any new action
// // sets
// // that have been added but not yet considered by this perspective.
// ActionSetRegistry reg = WorkbenchPlugin.getDefault()
// .getActionSetRegistry();
// IActionSetDescriptor[] array = reg.getActionSets();
// int count = array.length;
// for (int i = 0; i < count; i++)
// {
// IActionSetDescriptor desc = array[i];
// if ((!knownActionSetIds.contains(desc.getId()))
// && (desc.isInitiallyVisible()))
// {
// addActionSet(desc);
// }
// }
}
catch (...)
{
// // restart context changes
// if (service != 0)
// {
// StartupThreading.runWithoutExceptions(new StartupRunnable()
// {
// void runWithException() throws Throwable
// {
// service.activateContext(ContextAuthority.SEND_EVENTS);
// }
// });
// }
}
// Save presentation.
presentation = pres;
// Hide the editor area if needed. Need to wait for the
// presentation to be fully setup first.
int areaVisible = 0;
bool areaVisibleExists = memento->GetInteger(WorkbenchConstants::TAG_AREA_VISIBLE, areaVisible);
// Rather than hiding the editors now we must wait until after their
// controls
// are created. This ensures that if an editor is instantiated,
// createPartControl
// is also called. See bug 20166.
shouldHideEditorsOnActivate = (areaVisibleExists && areaVisible == 0);
// // Restore the trim state of the editor area
// IPreferenceStore preferenceStore = PrefUtil.getAPIPreferenceStore();
// bool useNewMinMax = preferenceStore.getbool(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX);
// if (useNewMinMax)
// {
// Integer trimStateInt = memento.getInteger(IWorkbenchConstants.TAG_AREA_TRIM_STATE);
// if (trimStateInt != 0)
// {
// editorAreaState = trimStateInt.intValue() & 0x3; // low order two bits contain the state
// editorAreaRestoreOnUnzoom = (trimStateInt.intValue() & 4) != 0;
// }
// }
// restore the fixed state
int isFixed = 0;
fixed = (memento->GetInteger(WorkbenchConstants::TAG_FIXED, isFixed) && isFixed == 1);
return true;
}
QList Perspective::GetShowInIdsFromRegistry()
{
PerspectiveExtensionReader reader;
QList tags;
tags.push_back(WorkbenchRegistryConstants::TAG_SHOW_IN_PART);
reader.SetIncludeOnlyTags(tags);
PageLayout::Pointer layout(new PageLayout());
reader.ExtendLayout(descriptor->GetOriginalId(), layout);
return layout->GetShowInPartIds();
}
void Perspective::SaveDesc()
{
this->SaveDescAs(descriptor);
}
void Perspective::SaveDescAs(IPerspectiveDescriptor::Pointer /*desc*/)
{
//TODO Perspective SaveDescAs
// PerspectiveDescriptor::Pointer realDesc = desc.Cast();
// //get the layout from the registry
// PerspectiveRegistry* perspRegistry = dynamic_cast(WorkbenchPlugin
// ::GetDefault()->GetPerspectiveRegistry());
// // Capture the layout state.
// XMLMemento memento = XMLMemento.createWriteRoot("perspective");//$NON-NLS-1$
// IStatus status = saveState(memento, realDesc, false);
// if (status.getSeverity() == IStatus.ERR)
// {
// ErrorDialog.openError((Shell) 0, WorkbenchMessages.Perspective_problemSavingTitle,
// WorkbenchMessages.Perspective_problemSavingMessage,
// status);
// return;
// }
// //save it to the preference store
// try
// {
// perspRegistry.saveCustomPersp(realDesc, memento);
// descriptor = realDesc;
// }
// catch (IOException e)
// {
// perspRegistry.deletePerspective(realDesc);
// MessageDialog.openError((Shell) 0, WorkbenchMessages.Perspective_problemSavingTitle,
// WorkbenchMessages.Perspective_problemSavingMessage);
// }
}
bool Perspective::SaveState(IMemento::Pointer memento)
{
// MultiStatus result = new MultiStatus(
// PlatformUI.PLUGIN_ID,
// IStatus.OK,
// WorkbenchMessages.Perspective_problemsSavingPerspective, 0);
//
// result.merge(saveState(memento, descriptor, true));
bool result = true;
result &= this->SaveState(memento, descriptor, true);
return result;
}
bool Perspective::SaveState(IMemento::Pointer memento, PerspectiveDescriptor::Pointer p,
bool saveInnerViewState)
{
// MultiStatus result = new MultiStatus(
// PlatformUI.PLUGIN_ID,
// IStatus.OK,
// WorkbenchMessages.Perspective_problemsSavingPerspective, 0);
bool result = true;
if (this->memento)
{
memento->PutMemento(this->memento);
return result;
}
// Save the version number.
memento->PutString(WorkbenchConstants::TAG_VERSION, VERSION_STRING);
//result.add(p.saveState(memento));
result &= p->SaveState(memento);
if (!saveInnerViewState)
{
QRect bounds(page->GetWorkbenchWindow()->GetShell()->GetBounds());
IMemento::Pointer boundsMem = memento
->CreateChild(WorkbenchConstants::TAG_WINDOW);
boundsMem->PutInteger(WorkbenchConstants::TAG_X, bounds.x());
boundsMem->PutInteger(WorkbenchConstants::TAG_Y, bounds.y());
boundsMem->PutInteger(WorkbenchConstants::TAG_HEIGHT, bounds.height());
boundsMem->PutInteger(WorkbenchConstants::TAG_WIDTH, bounds.width());
}
// // Save the "always on" action sets.
// Iterator itr = alwaysOnActionSets.iterator();
// while (itr.hasNext())
// {
// IActionSetDescriptor desc = (IActionSetDescriptor) itr.next();
// IMemento child = memento
// .createChild(IWorkbenchConstants.TAG_ALWAYS_ON_ACTION_SET);
// child.putString(IWorkbenchConstants.TAG_ID, desc.getId());
// }
// // Save the "always off" action sets.
// itr = alwaysOffActionSets.iterator();
// while (itr.hasNext())
// {
// IActionSetDescriptor desc = (IActionSetDescriptor) itr.next();
// IMemento child = memento
// .createChild(IWorkbenchConstants.TAG_ALWAYS_OFF_ACTION_SET);
// child.putString(IWorkbenchConstants.TAG_ID, desc.getId());
// }
// Save "show view actions"
for (QList::iterator itr = showViewShortcuts.begin();
itr != showViewShortcuts.end(); ++itr)
{
IMemento::Pointer child = memento
->CreateChild(WorkbenchConstants::TAG_SHOW_VIEW_ACTION);
child->PutString(WorkbenchConstants::TAG_ID, *itr);
}
// // Save "show in times"
// itr = showInTimes.keySet().iterator();
// while (itr.hasNext())
// {
// String id = (String) itr.next();
// Long time = (Long) showInTimes.get(id);
// IMemento child = memento
// .createChild(IWorkbenchConstants.TAG_SHOW_IN_TIME);
// child.putString(IWorkbenchConstants.TAG_ID, id);
// child.putString(IWorkbenchConstants.TAG_TIME, time.toString());
// }
// // Save "new wizard actions".
// itr = newWizardShortcuts.iterator();
// while (itr.hasNext())
// {
// String str = (String) itr.next();
// IMemento child = memento
// .createChild(IWorkbenchConstants.TAG_NEW_WIZARD_ACTION);
// child.putString(IWorkbenchConstants.TAG_ID, str);
// }
// Save "perspective actions".
for (QList::iterator itr = perspectiveShortcuts.begin();
itr != perspectiveShortcuts.end(); ++itr)
{
IMemento::Pointer child = memento
->CreateChild(WorkbenchConstants::TAG_PERSPECTIVE_ACTION);
child->PutString(WorkbenchConstants::TAG_ID, *itr);
}
// Get visible views.
QList viewPanes;
presentation->CollectViewPanes(viewPanes);
// Save the views.
for (QList::iterator itr = viewPanes.begin();
itr != viewPanes.end(); ++itr)
{
IWorkbenchPartReference::Pointer ref((*itr)->GetPartReference());
IViewDescriptor::Pointer desc = page->GetViewFactory()->GetViewRegistry()
->Find(ref->GetId());
if(desc && desc->IsRestorable())
{
IMemento::Pointer viewMemento = memento
->CreateChild(WorkbenchConstants::TAG_VIEW);
viewMemento->PutString(WorkbenchConstants::TAG_ID, ViewFactory::GetKey(ref.Cast()));
}
}
// // save all fastview state
// if (fastViewManager != 0)
// fastViewManager.saveState(memento);
// Save the view layout recs.
for (QHash::iterator i = mapIDtoViewLayoutRec.begin();
i != mapIDtoViewLayoutRec.end(); ++i)
{
QString compoundId(i.key());
ViewLayoutRec::Pointer rec(i.value());
if (rec && (!rec->isCloseable || !rec->isMoveable || rec->isStandalone))
{
IMemento::Pointer layoutMemento(memento
->CreateChild(WorkbenchConstants::TAG_VIEW_LAYOUT_REC));
layoutMemento->PutString(WorkbenchConstants::TAG_ID, compoundId);
if (!rec->isCloseable)
{
layoutMemento->PutString(WorkbenchConstants::TAG_CLOSEABLE,
WorkbenchConstants::FALSE_VAL);
}
if (!rec->isMoveable)
{
layoutMemento->PutString(WorkbenchConstants::TAG_MOVEABLE,
WorkbenchConstants::FALSE_VAL);
}
if (rec->isStandalone)
{
layoutMemento->PutString(WorkbenchConstants::TAG_STANDALONE,
WorkbenchConstants::TRUE_VAL);
layoutMemento->PutString(WorkbenchConstants::TAG_SHOW_TITLE,
rec->showTitle ? WorkbenchConstants::TRUE_VAL : WorkbenchConstants::FALSE_VAL);
}
}
}
// Save the layout.
IMemento::Pointer childMem(memento->CreateChild(WorkbenchConstants::TAG_LAYOUT));
//result.add(presentation.saveState(childMem));
result &= presentation->SaveState(childMem);
// Save the editor visibility state
if (this->IsEditorAreaVisible())
{
memento->PutInteger(WorkbenchConstants::TAG_AREA_VISIBLE, 1);
}
else
{
memento->PutInteger(WorkbenchConstants::TAG_AREA_VISIBLE, 0);
}
// // Save the trim state of the editor area if using the new min/max
// IPreferenceStore preferenceStore = PrefUtil.getAPIPreferenceStore();
// bool useNewMinMax = preferenceStore.getbool(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX);
// if (useNewMinMax)
// {
// int trimState = editorAreaState;
// trimState |= editorAreaRestoreOnUnzoom ? 4 : 0;
// memento.putInteger(IWorkbenchConstants.TAG_AREA_TRIM_STATE, trimState);
// }
// Save the fixed state
if (fixed)
{
memento->PutInteger(WorkbenchConstants::TAG_FIXED, 1);
}
else
{
memento->PutInteger(WorkbenchConstants::TAG_FIXED, 0);
}
return result;
}
void Perspective::SetPerspectiveActionIds(const QList& list)
{
perspectiveShortcuts = list;
}
void Perspective::SetShowInPartIds(const QList& list)
{
showInPartIds = list;
}
void Perspective::SetShowViewActionIds(const QList& list)
{
showViewShortcuts = list;
}
void Perspective::ShowEditorArea()
{
if (this->IsEditorAreaVisible())
{
return;
}
editorHidden = false;
// Show the editor in the appropriate location
if (this->UseNewMinMax(Perspective::Pointer(this)))
{
bool isMinimized = editorAreaState == IStackPresentationSite::STATE_MINIMIZED;
if (!isMinimized)
{
// If the editor area is going to show then we have to restore
// if (getPresentation().getMaximizedStack() != 0)
// getPresentation().getMaximizedStack().setState(IStackPresentationSite.STATE_RESTORED);
this->ShowEditorAreaLocal();
}
// else
// setEditorAreaTrimVisibility(true);
}
else
{
this->ShowEditorAreaLocal();
}
}
void Perspective::ShowEditorAreaLocal()
{
if (editorHolder == 0 || editorHidden)
{
return;
}
// Replace the part holder with the editor area.
presentation->GetLayout()->Replace(editorHolder, editorArea);
editorHolder = 0;
}
void Perspective::SetEditorAreaState(int newState)
{
if (newState == editorAreaState)
return;
editorAreaState = newState;
// // reset the restore flag if we're not minimized
// if (newState != IStackPresentationSite::STATE_MINIMIZED)
// editorAreaRestoreOnUnzoom = false;
this->RefreshEditorAreaVisibility();
}
int Perspective::GetEditorAreaState()
{
return editorAreaState;
}
void Perspective::RefreshEditorAreaVisibility()
{
// Nothing shows up if the editor area isn't visible at all
if (editorHidden)
{
this->HideEditorAreaLocal();
//setEditorAreaTrimVisibility(false);
return;
}
PartStack::Pointer editorStack = editorArea.Cast()->GetUpperRightEditorStack();
if (editorStack == 0)
return;
// Whatever we're doing, make the current editor stack match it
//editorStack->SetStateLocal(editorAreaState);
// If it's minimized then it's in the trim
if (editorAreaState == IStackPresentationSite::STATE_MINIMIZED)
{
// Hide the editor area and show its trim
this->HideEditorAreaLocal();
//setEditorAreaTrimVisibility(true);
}
else
{
// Show the editor area and hide its trim
//setEditorAreaTrimVisibility(false);
this->ShowEditorAreaLocal();
// if (editorAreaState == IStackPresentationSite::STATE_MAXIMIZED)
// getPresentation().setMaximizedStack(editorStack);
}
}
IViewReference::Pointer Perspective::GetViewReference(const QString& viewId, const QString& secondaryId)
{
IViewReference::Pointer ref = page->FindViewReference(viewId, secondaryId);
if (ref == 0)
{
ViewFactory* factory = this->GetViewFactory();
try
{
ref = factory->CreateView(viewId, secondaryId);
}
catch (PartInitException& /*e*/)
{
// IStatus status = StatusUtil.newStatus(IStatus.ERR,
// e.getMessage() == 0 ? "" : e.getMessage(), //$NON-NLS-1$
// e);
// StatusUtil.handleStatus(status, "Failed to create view: id=" + viewId, //$NON-NLS-1$
// StatusManager.LOG);
//TODO Perspective status message
WorkbenchPlugin::Log("Failed to create view: id=" + viewId);
}
}
return ref;
}
IViewPart::Pointer Perspective::ShowView(const QString& viewId, const QString& secondaryId)
{
ViewFactory* factory = this->GetViewFactory();
IViewReference::Pointer ref = factory->CreateView(viewId, secondaryId);
IViewPart::Pointer part = ref->GetPart(true).Cast();
if (part == 0)
{
throw PartInitException("Could not create view: " + ref->GetId());
}
PartSite::Pointer site = part->GetSite().Cast();
PartPane::Pointer pane = site->GetPane();
//TODO Perspective preference store
// IPreferenceStore store = WorkbenchPlugin.getDefault()
// .getPreferenceStore();
// int openViewMode = store.getInt(IPreferenceConstants.OPEN_VIEW_MODE);
//
// if (openViewMode == IPreferenceConstants.OVM_FAST &&
// fastViewManager != 0)
// {
// fastViewManager.addViewReference(FastViewBar.FASTVIEWBAR_ID, -1, ref, true);
// setActiveFastView(ref);
// }
// else if (openViewMode == IPreferenceConstants.OVM_FLOAT
// && presentation.canDetach())
// {
// presentation.addDetachedPart(pane);
// }
// else
// {
if (this->UseNewMinMax(Perspective::Pointer(this)))
{
// Is this view going to show in the trim?
// LayoutPart vPart = presentation.findPart(viewId, secondaryId);
// Determine if there is a trim stack that should get the view
QString trimId;
// // If we can locate the correct trim stack then do so
// if (vPart != 0)
// {
// String id = 0;
// ILayoutContainer container = vPart.getContainer();
// if (container.Cast() != 0)
// id = ((ContainerPlaceholder)container).getID();
// else if (container.Cast() != 0)
// id = ((ViewStack)container).getID();
//
// // Is this place-holder in the trim?
// if (id != 0 && fastViewManager.getFastViews(id).size()> 0)
// {
// trimId = id;
// }
// }
//
// // No explicit trim found; If we're maximized then we either have to find an
// // arbitrary stack...
// if (trimId == 0 && presentation.getMaximizedStack() != 0)
// {
// if (vPart == 0)
// {
// ViewStackTrimToolBar blTrimStack = fastViewManager.getBottomRightTrimStack();
// if (blTrimStack != 0)
// {
// // OK, we've found a trim stack to add it to...
// trimId = blTrimStack.getId();
//
// // Since there was no placeholder we have to add one
// LayoutPart blPart = presentation.findPart(trimId, 0);
// if (blPart.Cast() != 0)
// {
// ContainerPlaceholder cph = (ContainerPlaceholder) blPart;
// if (cph.getRealContainer().Cast() != 0)
// {
// ViewStack vs = (ViewStack) cph.getRealContainer();
//
// // Create a 'compound' id if this is a multi-instance part
// String compoundId = ref.getId();
// if (ref.getSecondaryId() != 0)
// compoundId = compoundId + ':' + ref.getSecondaryId();
//
// // Add the new placeholder
// vs.add(new PartPlaceholder(compoundId));
// }
// }
// }
// }
// }
//
// // If we have a trim stack located then add the view to it
// if (trimId != "")
// {
// fastViewManager.addViewReference(trimId, -1, ref, true);
// }
// else
// {
// bool inMaximizedStack = vPart != 0 && vPart.getContainer() == presentation.getMaximizedStack();
// Do the default behavior
presentation->AddPart(pane);
// // Now, if we're maximized then we have to minimize the new stack
// if (presentation.getMaximizedStack() != 0 && !inMaximizedStack)
// {
// vPart = presentation.findPart(viewId, secondaryId);
// if (vPart != 0 && vPart.getContainer().Cast() != 0)
// {
// ViewStack vs = (ViewStack)vPart.getContainer();
// vs.setState(IStackPresentationSite.STATE_MINIMIZED);
//
// // setting the state to minimized will create the trim toolbar
// // so we don't need a 0 pointer check here...
// fastViewManager.getViewStackTrimToolbar(vs.getID()).setRestoreOnUnzoom(true);
// }
// }
// }
}
else
{
presentation->AddPart(pane);
}
//}
// Ensure that the newly showing part is enabled
if (pane != 0 && pane->GetControl() != 0)
Tweaklets::Get(GuiWidgetsTweaklet::KEY)->SetEnabled(pane->GetControl(), true);
return part;
}
IWorkbenchPartReference::Pointer Perspective::GetOldPartRef()
{
return oldPartRef;
}
void Perspective::SetOldPartRef(IWorkbenchPartReference::Pointer oldPartRef)
{
this->oldPartRef = oldPartRef;
}
bool Perspective::IsCloseable(IViewReference::Pointer reference)
{
ViewLayoutRec::Pointer rec = this->GetViewLayoutRec(reference, false);
if (rec != 0)
{
return rec->isCloseable;
}
return true;
}
bool Perspective::IsMoveable(IViewReference::Pointer reference)
{
ViewLayoutRec::Pointer rec = this->GetViewLayoutRec(reference, false);
if (rec != 0)
{
return rec->isMoveable;
}
return true;
}
void Perspective::DescribeLayout(QString& buf) const
{
// QList fastViews = getFastViews();
//
// if (fastViews.length != 0)
// {
// buf.append("fastviews ("); //$NON-NLS-1$
// for (int idx = 0; idx < fastViews.length; idx++)
// {
// IViewReference ref = fastViews[idx];
//
// if (idx> 0)
// {
// buf.append(", "); //$NON-NLS-1$
// }
//
// buf.append(ref.getPartName());
// }
// buf.append("), "); //$NON-NLS-1$
// }
this->GetPresentation()->DescribeLayout(buf);
}
void Perspective::TestInvariants()
{
this->GetPresentation()->GetLayout()->TestInvariants();
}
bool Perspective::UseNewMinMax(Perspective::Pointer activePerspective)
{
// We need to have an active perspective
if (activePerspective == 0)
return false;
// We need to have a trim manager (if we don't then we
// don't create a FastViewManager because it'd be useless)
// if (activePerspective->GetFastViewManager() == 0)
// return false;
// Make sure we don't NPE anyplace
WorkbenchWindow::Pointer wbw = activePerspective->page->GetWorkbenchWindow().Cast();
if (wbw == 0)
return false;
// WorkbenchWindowConfigurer* configurer = wbw->GetWindowConfigurer();
// if (configurer == 0)
// return false;
IPresentationFactory* factory = WorkbenchPlugin::GetDefault()->GetPresentationFactory();
if (factory == 0)
return false;
// Ok, we should be good to go, return the pref
//IPreferenceStore preferenceStore = PrefUtil.getAPIPreferenceStore();
//bool useNewMinMax = preferenceStore.getbool(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX);
return true;
}
}
diff --git a/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryQtShell.cpp b/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryQtShell.cpp
index dd230297b3..c7e0e4346a 100755
--- a/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryQtShell.cpp
+++ b/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryQtShell.cpp
@@ -1,203 +1,203 @@
/*===================================================================
BlueBerry Platform
Copyright (c) German Cancer Research Center,
Division of Medical and Biological Informatics.
All rights reserved.
This software is distributed WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.
See LICENSE.txt or http://www.mitk.org for details.
===================================================================*/
#include
#include "berryQtShell.h"
#include "berryQtWidgetsTweakletImpl.h"
#include "berryQtMainWindowControl.h"
#include
#include
#include
#include
#include
namespace berry
{
QtShell::QtShell(QWidget* parent, Qt::WindowFlags flags)
: updatesDisabled(false)
{
if (parent == 0 || flags.testFlag(Qt::Window))
{
widget = new QtMainWindowControl(this, parent, flags);
widget->setUpdatesEnabled(false);
updatesDisabled = true;
widget->setAttribute(Qt::WA_DeleteOnClose);
}
else
{
widget = new QtControlWidget(parent, this, flags | Qt::Dialog);
widget->setObjectName("shell widget");
}
widget->setProperty("shell", QVariant::fromValue(static_cast(this)));
}
QtShell::~QtShell()
{
widget->deleteLater();
}
void QtShell::SetBounds(const QRect& bounds)
{
widget->setGeometry(bounds);
}
QRect QtShell::GetBounds() const
{
return widget->frameGeometry();
}
void QtShell::SetLocation(int x, int y)
{
widget->move(x, y);
}
QPoint QtShell::ComputeSize(int /*wHint*/, int /*hHint*/, bool changed)
{
if (changed) widget->updateGeometry();
QSize size(widget->size());
QPoint point(size.width(), size.height());
return point;
}
QString QtShell::GetText() const
{
return widget->windowTitle();
}
void QtShell::SetText(const QString& title)
{
widget->setWindowTitle(title);
widget->setObjectName(title);
}
-bool QtShell::IsVisible()
+bool QtShell::IsVisible() const
{
return widget->isVisible();
}
void QtShell::SetVisible(bool visible)
{
widget->setVisible(visible);
}
void QtShell::SetActive()
{
widget->activateWindow();
widget->raise();
}
QWidget *QtShell::GetControl()
{
return widget;
}
void QtShell::SetImages(const QList& /*images*/)
{
}
-bool QtShell::GetMaximized()
+bool QtShell::GetMaximized() const
{
return widget->isMaximized();
}
-bool QtShell::GetMinimized()
+bool QtShell::GetMinimized() const
{
return widget->isMinimized();
}
void QtShell::SetMaximized(bool maximized)
{
maximized ? widget->showMaximized() : widget->showNormal();
}
void QtShell::SetMinimized(bool minimized)
{
minimized ? widget->showMinimized() : widget->showNormal();
}
void QtShell::AddShellListener(IShellListener* listener)
{
QVariant variant = widget->property(QtWidgetController::PROPERTY_ID);
poco_assert(variant.isValid());
QtWidgetController::Pointer controller = variant.value();
poco_assert(controller != 0);
controller->AddShellListener(listener);
}
void QtShell::RemoveShellListener(IShellListener* listener)
{
QVariant variant = widget->property(QtWidgetController::PROPERTY_ID);
if (variant.isValid())
{
QtWidgetController::Pointer controller = variant.value();
if (controller != 0)
controller->RemoveShellListener(listener);
}
}
void QtShell::Open(bool block)
{
if (updatesDisabled)
{
widget->setUpdatesEnabled(true);
updatesDisabled = false;
}
widget->setWindowModality(block ? Qt::WindowModal : Qt::NonModal);
widget->show();
}
void QtShell::Close()
{
widget->close();
}
QList QtShell::GetShells()
{
GuiWidgetsTweaklet* widgetTweaklet = Tweaklets::Get(GuiWidgetsTweaklet::KEY);
QList allShells(widgetTweaklet->GetShells());
QList descendants;
for (int i = 0; i < allShells.size(); ++i)
{
Shell::Pointer shell = allShells[i];
if (widgetTweaklet->GetShell(shell->GetControl()) == this)
{
descendants.push_back(shell);
}
}
return descendants;
}
Qt::WindowFlags QtShell::GetStyle() const
{
return widget->windowFlags();
}
QWidget* QtShell::GetWidget()
{
return widget;
}
}
diff --git a/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryQtShell.h b/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryQtShell.h
index e1bae87184..be720b76bc 100755
--- a/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryQtShell.h
+++ b/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryQtShell.h
@@ -1,85 +1,85 @@
/*===================================================================
BlueBerry Platform
Copyright (c) German Cancer Research Center,
Division of Medical and Biological Informatics.
All rights reserved.
This software is distributed WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.
See LICENSE.txt or http://www.mitk.org for details.
===================================================================*/
#ifndef BERRYQTMAINWINDOWSHELL_H_
#define BERRYQTMAINWINDOWSHELL_H_
#include
#include
namespace berry {
class QtAbstractControlWidget;
class QtShell : public Shell
{
public:
QtShell(QWidget* parent = 0, Qt::WindowFlags flags = 0);
~QtShell();
// berry::Shell
void SetBounds(const QRect& bounds);
QRect GetBounds() const;
void SetLocation(int x, int y);
QPoint ComputeSize(int wHint, int hHint, bool changed);
QString GetText() const;
void SetText(const QString& text);
- bool IsVisible();
+ bool IsVisible() const;
void SetVisible(bool visible);
void SetActive();
QWidget* GetControl();
void SetImages(const QList& images);
- bool GetMaximized();
- bool GetMinimized();
+ bool GetMaximized() const;
+ bool GetMinimized() const;
void SetMaximized(bool maximized);
void SetMinimized(bool minimized);
void AddShellListener(IShellListener* listener);
void RemoveShellListener(IShellListener* listener);
void Open(bool block = false);
void Close();
QList GetShells();
Qt::WindowFlags GetStyle () const;
QWidget* GetWidget();
private:
QWidget* widget;
bool updatesDisabled;
};
}
#endif /* BERRYQTMAINWINDOWSHELL_H_ */
diff --git a/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryWorkbench.h b/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryWorkbench.h
index 9f9d2dc5d7..9464cb456f 100644
--- a/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryWorkbench.h
+++ b/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryWorkbench.h
@@ -1,635 +1,635 @@
/*===================================================================
BlueBerry Platform
Copyright (c) German Cancer Research Center,
Division of Medical and Biological Informatics.
All rights reserved.
This software is distributed WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.
See LICENSE.txt or http://www.mitk.org for details.
===================================================================*/
#ifndef BERRYWORKBENCH_H_
#define BERRYWORKBENCH_H_
#include "berryIViewPart.h"
#include "berryIWorkbench.h"
#include "berryWorkbenchWindow.h"
#include "berryIWorkbenchPage.h"
#include "berryIWorkbenchPartReference.h"
#include "berryXMLMemento.h"
#include "berryPartPane.h"
#include "berryEditorAreaHelper.h"
#include "berryWindowManager.h"
#include "berryWorkbenchConfigurer.h"
#include "application/berryWorkbenchAdvisor.h"
#include "berryWorkbenchTestable.h"
#include "intro/berryIntroDescriptor.h"
#include "intro/berryWorkbenchIntroManager.h"
#include "berryILayoutContainer.h"
#include "berryServiceLocator.h"
#include
#include
namespace berry {
struct ICommandService;
struct IEvaluationService;
struct IMenuService;
struct IServiceLocatorCreator;
struct ISaveablesLifecycleListener;
struct ISourceProviderService;
struct IWorkbenchLocationService;
class CommandManager;
class ViewRegistry;
class EditorRegistry;
class WorkbenchWindowConfigurer;
/**
* \ingroup org_blueberry_ui_qt
*
* The workbench class represents the top of the BlueBerry user interface. Its
* primary responsibility is the management of workbench windows, dialogs,
* wizards, and other workbench-related windows.
*
* Note that any code that is run during the creation of a workbench instance
* should not required access to the display.
*/
class BERRY_UI_QT Workbench : public IWorkbench
{
public:
berryObjectMacro(Workbench)
friend class RestoreStateRunnable;
/**
* Creates the workbench and associates it with the the given display and
* workbench advisor, and runs the workbench UI. This entails processing and
* dispatching events until the workbench is closed or restarted.
*
* This method is intended to be called by PlatformUI
. Fails
* if the workbench UI has already been created.
*
*
* The display passed in must be the default display.
*
*
* @param display
* the display to be used for all UI interactions with the
* workbench
* @param advisor
* the application-specific advisor that configures and
* specializes the workbench
* @return return code {@link PlatformUI#RETURN_OK RETURN_OK}for normal
* exit; {@link PlatformUI#RETURN_RESTART RETURN_RESTART}if the
* workbench was terminated with a call to
* {@link IWorkbench#restart IWorkbench.restart}; other values
* reserved for future use
*/
static int CreateAndRunWorkbench(Display* display, WorkbenchAdvisor* advisor);
/**
* Creates the Display
to be used by the workbench.
*
* @return the display
*/
static Display* CreateDisplay();
/**
* Returns the one and only instance of the workbench, if there is one.
*
* @return the workbench, or null
if the workbench has not
* been created, or has been created and already completed
*/
static Workbench* GetInstance();
virtual ~Workbench();
/*
* (non-Javadoc)
*
* @see org.blueberry.ui.services.IServiceLocator#getService(java.lang.Object)
*/
Object* GetService(const QString& key);
/*
* (non-Javadoc)
*
* @see org.blueberry.ui.services.IServiceLocator#hasService(java.lang.Object)
*/
bool HasService(const QString& key) const;
/*
* Method declared on IWorkbench.
*/
bool Close();
/**
* Returns the testable object facade, for use by the test harness.
*
* @return the testable object facade
* @since 3.0
*/
static WorkbenchTestable::Pointer GetWorkbenchTestable();
/*
* Method declared on IWorkbench.
*/
void AddWorkbenchListener(IWorkbenchListener* listener);
/*
* Method declared on IWorkbench.
*/
void RemoveWorkbenchListener(IWorkbenchListener* listener);
/*
* Method declared on IWorkbench.
*/
IWorkbenchListener::Events& GetWorkbenchEvents();
/*
* Method declared on IWorkbench.
*/
void AddWindowListener(IWindowListener* l);
/*
* Method declared on IWorkbench.
*/
void RemoveWindowListener(IWindowListener* l);
/*
* Method declared on IWorkbench.
*/
IWindowListener::Events& GetWindowEvents();
IWorkbenchWindow::Pointer GetActiveWorkbenchWindow() const;
IViewRegistry* GetViewRegistry();
IEditorRegistry* GetEditorRegistry();
IPerspectiveRegistry* GetPerspectiveRegistry();
std::size_t GetWorkbenchWindowCount();
QList GetWorkbenchWindows();
IWorkbenchWindow::Pointer OpenWorkbenchWindow(const QString& perspectiveId,
IAdaptable* input);
IWorkbenchWindow::Pointer OpenWorkbenchWindow(IAdaptable* input);
IWorkbenchPage::Pointer ShowPerspective(const QString& perspectiveId,
IWorkbenchWindow::Pointer window);
IWorkbenchPage::Pointer ShowPerspective(const QString& perspectiveId,
IWorkbenchWindow::Pointer window, IAdaptable* input);
bool SaveAllEditors(bool confirm);
IIntroManager* GetIntroManager();
/**
* @return the workbench intro manager
*/
WorkbenchIntroManager* GetWorkbenchIntroManager();
/**
* @return the intro extension for this workbench.
*/
IntroDescriptor::Pointer GetIntroDescriptor() const;
/**
* This method exists as a test hook. This method should NEVER
* be called by clients.
*
* @param descriptor
* The intro descriptor to use.
*/
void SetIntroDescriptor(IntroDescriptor::Pointer descriptor);
/**
* Returns true
if the workbench is running,
* false
if it has been terminated.
*
* @return true
if the workbench is running,
* false
if it has been terminated.
*/
bool IsRunning();
/**
* Returns true if the Workbench is in the process of starting.
*
* @return true
if the Workbench is starting, but not yet
* running the event loop.
*/
bool IsStarting();
bool IsClosing();
/**
* Returns the default perspective id, which may be null
.
*
* @return the default perspective id, or null
*/
QString GetDefaultPerspectiveId();
/**
* Returns the default workbench window page input.
*
* @return the default window page input or null
if none
*/
IAdaptable* GetDefaultPageInput();
/**
* Return the presentation ID specified by the preference or the default ID
* if undefined.
*
* @return the presentation ID
* @see IWorkbenchPreferenceConstants#PRESENTATION_FACTORY_ID
*/
QString GetPresentationId();
void UpdateTheme();
/**
*
* Indicates the start of a large update within the workbench. This is used
* to disable CPU-intensive, change-sensitive services that were temporarily
* disabled in the midst of large changes. This method should always be
* called in tandem with largeUpdateEnd
, and the event loop
* should not be allowed to spin before that method is called.
*
*
* Important: always use with largeUpdateEnd
!
*
*/
void LargeUpdateStart();
/**
*
* Indicates the end of a large update within the workbench. This is used to
* re-enable services that were temporarily disabled in the midst of large
* changes. This method should always be called in tandem with
* largeUpdateStart
, and the event loop should not be
* allowed to spin before this method is called.
*
*
* Important: always protect this call by using finally
!
*
*/
void LargeUpdateEnd();
protected:
friend class PlatformUI;
friend class WorkbenchConfigurer;
friend class WorkbenchWindowConfigurer;
friend class WorkbenchWindow;
- friend struct WorkbenchWindow::ShellActivationListener;
+ friend struct WorkbenchWindow::ShellEventFilter;
int RunUI();
void OpenFirstTimeWindow();
IWorkbenchWindow::Pointer RestoreWorkbenchWindow(IMemento::Pointer memento);
bool Init();
/*
* Restores the workbench UI from the workbench state file (workbench.xml).
*
* @return a status object indicating OK if a window was opened,
* RESTORE_CODE_RESET if no window was opened but one should be, and
* RESTORE_CODE_EXIT if the workbench should close immediately
*/
/* package */
bool RestoreState();
/**
* Closes the workbench, returning the given return code from the run
* method. If forced, the workbench is closed no matter what.
*
* @param returnCode
* {@link PlatformUI#RETURN_OK RETURN_OK}for normal exit;
* {@link PlatformUI#RETURN_RESTART RETURN_RESTART}if the
* workbench was terminated with a call to
* {@link IWorkbench#restart IWorkbench.restart};
* {@link PlatformUI#RETURN_EMERGENCY_CLOSE} for an emergency
* shutdown
* {@link PlatformUI#RETURN_UNSTARTABLE RETURN_UNSTARTABLE}if
* the workbench could not be started; other values reserved for
* future use
*
* @param force
* true to force the workbench close, and false for a "soft"
* close that can be canceled
* @return true if the close was successful, and false if the close was
* canceled
*/
/* package */
bool Close(int returnCode, bool force);
/**
* Returns the unique object that applications use to configure the
* workbench.
*
* IMPORTANT This method is declared protected to prevent regular
* plug-ins from downcasting IWorkbench to Workbench and getting hold of the
* workbench configurer that would allow them to tamper with the workbench.
* The workbench configurer is available only to the application.
*
*/
WorkbenchConfigurer::Pointer GetWorkbenchConfigurer();
/**
* Returns the workbench advisor that created this workbench.
*
* IMPORTANT This method is declared protected to prevent regular
* plug-ins from downcasting IWorkbench to Workbench and getting hold of the
* workbench advisor that would allow them to tamper with the workbench. The
* workbench advisor is internal to the application.
*
*/
WorkbenchAdvisor* GetAdvisor();
/*
* Returns the workbench window which was last known being the active one,
* or null
.
*/
SmartPointer GetActivatedWindow() const;
/*
* Sets the workbench window which was last known being the active one, or
* null
.
*/
void SetActivatedWindow(SmartPointer window);
/**
* Fire workbench preShutdown event, stopping at the first one to veto
*
* @param forced
* flag indicating whether the shutdown is being forced
* @return true
to allow the workbench to proceed with
* shutdown, false
to veto a non-forced shutdown
* @since 3.2
*/
bool FirePreShutdown(bool forced);
/**
* Fire workbench postShutdown event.
*
* @since 3.2
*/
void FirePostShutdown();
/**
* Fire window opened event.
*
* @param window
* The window which just opened; should not be null
.
*/
void FireWindowOpened(IWorkbenchWindow::Pointer window);
/**
* Fire window closed event.
*
* @param window
* The window which just closed; should not be null
.
*/
void FireWindowClosed(IWorkbenchWindow::Pointer window);
/**
* Fire window activated event.
*
* @param window
* The window which was just activated; should not be
* null
.
*/
void FireWindowActivated(IWorkbenchWindow::Pointer window);
/**
* Fire window deactivated event.
*
* @param window
* The window which was just deactivated; should not be
* null
.
*/
void FireWindowDeactivated(IWorkbenchWindow::Pointer window);
private:
/**
* Holds onto the only instance of Workbench.
*/
static Workbench* instance;
/**
* The testable object facade.
*/
static WorkbenchTestable::Pointer testableObject;
static const unsigned int VERSION_STRING_COUNT; // = 1;
static const QString VERSION_STRING[1];
static const QString DEFAULT_WORKBENCH_STATE_FILENAME; // = "workbench.xml";
IWorkbenchListener::Events workbenchEvents;
IWindowListener::Events windowEvents;
WorkbenchAdvisor* advisor;
WorkbenchConfigurer::Pointer workbenchConfigurer;
/**
* The service locator maintained by the workbench. These services are
* initialized during workbench during the init
method.
*/
ServiceLocator::Pointer serviceLocator;
QScopedPointer evaluationService;
QScopedPointer saveablesList;
/**
* The single instance of the command manager used by the workbench. This is
* initialized in Workbench.init(Display)
and then never
* changed. This value will only be null
if the
* initialization call has not yet completed.
*/
QScopedPointer commandManager;
QScopedPointer commandService;
QScopedPointer menuService;
/**
* A count of how many plug-ins were loaded while restoring the workbench
* state. Initially -1 for unknown number.
*/
int progressCount;
/**
* A field to hold the workbench windows that have been restored. In the
* event that not all windows have been restored, this field allows the
* openWindowsAfterRestore method to open some windows.
*/
QList createdWindows;
struct ServiceLocatorOwner : public IDisposable
{
ServiceLocatorOwner(Workbench* workbench);
void Dispose();
private:
Workbench* workbench;
};
friend struct ServiceLocatorOwner;
IDisposable::Pointer serviceLocatorOwner;
QScopedPointer serviceLocatorCreator;
QScopedPointer workbenchLocationService;
QScopedPointer sourceProviderService;
/**
* A count of how many large updates are going on. This tracks nesting of
* requests to disable services during a large update -- similar to the
* setRedraw
functionality on Control
. When
* this value becomes greater than zero, services are disabled. When this
* value becomes zero, services are enabled. Please see
* largeUpdateStart()
and largeUpdateEnd()
.
*/
int largeUpdates;
/**
* The display used for all UI interactions with this workbench.
*/
Display* display;
WindowManager windowManager;
SmartPointer activatedWindow;
QScopedPointer introManager;
/**
* The descriptor for the intro extension that is valid for this workspace,
* null
if none.
*/
IntroDescriptor::Pointer introDescriptor;
bool isStarting;
bool isClosing;
int returnCode;
QString factoryID;
/**
* Creates a new workbench.
*
* @param display
* the display to be used for all UI interactions with the
* workbench
* @param advisor
* the application-specific advisor that configures and
* specializes this workbench instance
*/
Workbench(Display*, WorkbenchAdvisor* advisor);
/**
* see IWorkbench#GetDisplay
*/
Display* GetDisplay();
/*
* Creates a new workbench window.
*
* @return the new workbench window
*/
SmartPointer NewWorkbenchWindow();
void OpenWindowsAfterRestore();
/*
* Returns the number for a new window. This will be the first number > 0
* which is not used to identify another window in the workbench.
*/
int GetNewWindowNumber();
/**
* Initializes all of the default services for the workbench. For
* initializing the command-based services, this also parses the registry
* and hooks up all the required listeners.
*/
void InitializeDefaultServices();
/**
* Closes the workbench. Assumes that the busy cursor is active.
*
* @param force
* true if the close is mandatory, and false if the close is
* allowed to fail
* @return true if the close succeeded, and false otherwise
*/
bool BusyClose(bool force);
/*
* Record the workbench UI in a document
*/
XMLMemento::Pointer RecordWorkbenchState();
/*
* Restores the state of the previously saved workbench
*/
bool RestoreState(IMemento::Pointer memento);
void DoRestoreState(IMemento::Pointer memento, bool& result);
/*
* Saves the current state of the workbench so it can be restored later on
*/
bool SaveState(IMemento::Pointer memento);
/*
* Save the workbench UI in a persistence file.
*/
bool SaveMementoToFile(XMLMemento::Pointer memento);
/*
* Answer the workbench state file.
*/
QString GetWorkbenchStateFile() const;
/*
* Shuts down the application.
*/
void Shutdown();
/**
* Opens a new workbench window and page with a specific perspective.
*
* Assumes that busy cursor is active.
*/
IWorkbenchWindow::Pointer BusyOpenWorkbenchWindow(const QString& perspID,
IAdaptable* input);
void InitializeSourcePriorities();
void StartSourceProviders();
};
} // namespace berry
#endif /*BERRYWORKBENCH_H_*/
diff --git a/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryWorkbenchWindow.cpp b/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryWorkbenchWindow.cpp
index 0aad01c756..b1b38256ce 100644
--- a/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryWorkbenchWindow.cpp
+++ b/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryWorkbenchWindow.cpp
@@ -1,1963 +1,1945 @@
/*===================================================================
BlueBerry Platform
Copyright (c) German Cancer Research Center,
Division of Medical and Biological Informatics.
All rights reserved.
This software is distributed WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.
See LICENSE.txt or http://www.mitk.org for details.
===================================================================*/
#include "tweaklets/berryGuiWidgetsTweaklet.h"
#include "tweaklets/berryWorkbenchTweaklet.h"
#include "berryWorkbenchWindow.h"
#include "berryIWorkbenchPage.h"
#include "berryIPerspectiveDescriptor.h"
+#include "berryIContextService.h"
#include "berryUIException.h"
#include "berryConstants.h"
#include "berryIMenuService.h"
#include "berryMenuUtil.h"
#include "intro/berryIntroConstants.h"
#include "berryWorkbenchPlugin.h"
#include "berryWorkbenchPage.h"
#include "berryWorkbench.h"
#include "berryWorkbenchConstants.h"
#include "berryPartSite.h"
#include "berryIServiceLocatorCreator.h"
#include "berryMenuManager.h"
#include "berryQtControlWidget.h"
#include "berryQtPerspectiveSwitcher.h"
#include "berryWWinActionBars.h"
#include "berryWorkbenchLocationService.h"
#include "berryIServiceFactory.h"
#include "berryIServiceScopes.h"
#include "berryIEvaluationReference.h"
#include "berryPlatformUI.h"
#include "berryDebugUtil.h"
#include
#include
#include
+#include
+#include
namespace berry
{
const QString WorkbenchWindow::PROP_TOOLBAR_VISIBLE = "toolbarVisible";
const QString WorkbenchWindow::PROP_PERSPECTIVEBAR_VISIBLE = "perspectiveBarVisible";
const QString WorkbenchWindow::PROP_STATUS_LINE_VISIBLE = "statusLineVisible";
const ActionBarAdvisor::FillFlags WorkbenchWindow::FILL_ALL_ACTION_BARS =
ActionBarAdvisor::FILL_MENU_BAR | ActionBarAdvisor::FILL_TOOL_BAR |
ActionBarAdvisor::FILL_STATUS_LINE;
WorkbenchWindow::WorkbenchWindow(int number)
: Window(Shell::Pointer(0))
, pageComposite(0)
, windowAdvisor(0)
, actionBarAdvisor(0)
, number(number)
, largeUpdates(0)
, closing(false)
, shellActivated(false)
, updateDisabled(true)
, toolBarVisible(true)
, perspectiveBarVisible(true)
, statusLineVisible(true)
, emptyWindowContentsCreated(false)
, emptyWindowContents(0)
, asMaximizedState(false)
, partService(this)
, serviceLocatorOwner(new ServiceLocatorOwner(this))
+ , resizeEventFilter(this)
{
this->Register(); // increase the reference count to avoid deleting
// this object when temporary smart pointers
// go out of scope
// Make sure there is a workbench. This call will throw
// an exception if workbench not created yet.
IWorkbench* workbench = PlatformUI::GetWorkbench();
IServiceLocatorCreator* slc = workbench->GetService();
this->serviceLocator = slc->CreateServiceLocator(
workbench,
nullptr,
IDisposable::WeakPtr(serviceLocatorOwner)).Cast();
InitializeDefaultServices();
// Add contribution managers that are exposed to other plugins.
this->AddMenuBar();
//addCoolBar(SWT.NONE); // style is unused
//addStatusLine();
this->FireWindowOpening();
// Fill the action bars
this->FillActionBars(FILL_ALL_ACTION_BARS);
this->UnRegister(false); // decrease reference count and avoid deleting
// the window
}
WorkbenchWindow::~WorkbenchWindow()
{
//BERRY_INFO << "WorkbenchWindow::~WorkbenchWindow()";
}
Object* WorkbenchWindow::GetService(const QString& key)
{
return serviceLocator->GetService(key);
}
bool WorkbenchWindow::HasService(const QString& key) const
{
return serviceLocator->HasService(key);
}
Shell::Pointer WorkbenchWindow::GetShell() const
{
return Window::GetShell();
}
bool WorkbenchWindow::ClosePage(IWorkbenchPage::Pointer in, bool save)
{
// Validate the input.
if (!pageList.Contains(in))
{
return false;
}
WorkbenchPage::Pointer oldPage = in.Cast ();
// Save old perspective.
if (save && oldPage->IsSaveNeeded())
{
if (!oldPage->SaveAllEditors(true))
{
return false;
}
}
// If old page is activate deactivate.
bool oldIsActive = (oldPage == this->GetActivePage());
if (oldIsActive)
{
this->SetActivePage(IWorkbenchPage::Pointer(0));
}
// Close old page.
pageList.Remove(oldPage);
partService.PageClosed(oldPage);
//this->FirePageClosed(oldPage);
//oldPage->Dispose();
// Activate new page.
if (oldIsActive)
{
IWorkbenchPage::Pointer newPage = pageList.GetNextActive();
if (newPage != 0)
{
this->SetActivePage(newPage);
}
}
if (!closing && pageList.IsEmpty())
{
this->ShowEmptyWindowContents();
}
return true;
}
void WorkbenchWindow::AddPerspectiveListener(IPerspectiveListener* l)
{
perspectiveEvents.AddListener(l);
}
void WorkbenchWindow::RemovePerspectiveListener(IPerspectiveListener* l)
{
perspectiveEvents.RemoveListener(l);
}
IPerspectiveListener::Events& WorkbenchWindow::GetPerspectiveEvents()
{
return perspectiveEvents;
}
void WorkbenchWindow::FireWindowOpening()
{
// let the application do further configuration
this->GetWindowAdvisor()->PreWindowOpen();
}
void WorkbenchWindow::FireWindowRestored()
{
//StartupThreading.runWithWorkbenchExceptions(new StartupRunnable() {
// public void runWithException() throws Throwable {
this->GetWindowAdvisor()->PostWindowRestore();
// }
//});
}
void WorkbenchWindow::FireWindowCreated()
{
this->GetWindowAdvisor()->PostWindowCreate();
}
void WorkbenchWindow::FireWindowOpened()
{
this->GetWorkbenchImpl()->FireWindowOpened(IWorkbenchWindow::Pointer(this));
this->GetWindowAdvisor()->PostWindowOpen();
}
bool WorkbenchWindow::FireWindowShellClosing()
{
return this->GetWindowAdvisor()->PreWindowShellClose();
}
void WorkbenchWindow::FireWindowClosed()
{
// let the application do further deconfiguration
this->GetWindowAdvisor()->PostWindowClose();
this->GetWorkbenchImpl()->FireWindowClosed(IWorkbenchWindow::Pointer(this));
}
///**
// * Fires page activated
// */
//void WorkbenchWindow::FirePageActivated(IWorkbenchPage::Pointer page) {
//// String label = null; // debugging only
//// if (UIStats.isDebugging(UIStats.NOTIFY_PAGE_LISTENERS)) {
//// label = "activated " + page.getLabel(); //$NON-NLS-1$
//// }
//// try {
//// UIStats.start(UIStats.NOTIFY_PAGE_LISTENERS, label);
//// UIListenerLogging.logPageEvent(this, page,
//// UIListenerLogging.WPE_PAGE_ACTIVATED);
// pageEvents.FirePageActivated(page);
// partService.pageActivated(page);
//// } finally {
//// UIStats.end(UIStats.NOTIFY_PAGE_LISTENERS, page.getLabel(), label);
//// }
//}
//
///**
// * Fires page closed
// */
//void WorkbenchWindow::FirePageClosed(IWorkbenchPage::Pointer page) {
// String label = null; // debugging only
// if (UIStats.isDebugging(UIStats.NOTIFY_PAGE_LISTENERS)) {
// label = "closed " + page.getLabel(); //$NON-NLS-1$
// }
// try {
// UIStats.start(UIStats.NOTIFY_PAGE_LISTENERS, label);
// UIListenerLogging.logPageEvent(this, page,
// UIListenerLogging.WPE_PAGE_CLOSED);
// pageListeners.firePageClosed(page);
// partService.pageClosed(page);
// } finally {
// UIStats.end(UIStats.NOTIFY_PAGE_LISTENERS, page.getLabel(), label);
// }
//
//}
//
///**
// * Fires page opened
// */
//void WorkbenchWindow::FirePageOpened(IWorkbenchPage::Pointer page) {
// String label = null; // debugging only
// if (UIStats.isDebugging(UIStats.NOTIFY_PAGE_LISTENERS)) {
// label = "opened " + page.getLabel(); //$NON-NLS-1$
// }
// try {
// UIStats.start(UIStats.NOTIFY_PAGE_LISTENERS, label);
// UIListenerLogging.logPageEvent(this, page,
// UIListenerLogging.WPE_PAGE_OPENED);
// pageListeners.firePageOpened(page);
// partService.pageOpened(page);
// } finally {
// UIStats.end(UIStats.NOTIFY_PAGE_LISTENERS, page.getLabel(), label);
// }
//}
void WorkbenchWindow::FirePerspectiveActivated(IWorkbenchPage::Pointer page,
IPerspectiveDescriptor::Pointer perspective)
{
// UIListenerLogging.logPerspectiveEvent(this, page, perspective,
// UIListenerLogging.PLE_PERSP_ACTIVATED);
perspectiveEvents.perspectiveActivated(page, perspective);
}
void WorkbenchWindow::FirePerspectivePreDeactivate(
IWorkbenchPage::Pointer page, IPerspectiveDescriptor::Pointer perspective)
{
// UIListenerLogging.logPerspectiveEvent(this, page, perspective,
// UIListenerLogging.PLE_PERSP_PRE_DEACTIVATE);
perspectiveEvents.perspectivePreDeactivate(page, perspective);
}
void WorkbenchWindow::FirePerspectiveDeactivated(IWorkbenchPage::Pointer page,
IPerspectiveDescriptor::Pointer perspective)
{
// UIListenerLogging.logPerspectiveEvent(this, page, perspective,
// UIListenerLogging.PLE_PERSP_DEACTIVATED);
perspectiveEvents.perspectiveDeactivated(page, perspective);
}
void WorkbenchWindow::FirePerspectiveChanged(IWorkbenchPage::Pointer page,
IPerspectiveDescriptor::Pointer perspective, const QString& changeId)
{
// Some callers call this even when there is no active perspective.
// Just ignore this case.
if (perspective != 0)
{
// UIListenerLogging.logPerspectiveChangedEvent(this, page,
// perspective, null, changeId);
perspectiveEvents.perspectiveChanged(page, perspective, changeId);
}
}
void WorkbenchWindow::FirePerspectiveChanged(IWorkbenchPage::Pointer page,
IPerspectiveDescriptor::Pointer perspective,
IWorkbenchPartReference::Pointer partRef, const QString& changeId)
{
// Some callers call this even when there is no active perspective.
// Just ignore this case.
if (perspective != 0)
{
// UIListenerLogging.logPerspectiveChangedEvent(this, page,
// perspective, partRef, changeId);
perspectiveEvents.perspectivePartChanged(page, perspective, partRef,
changeId);
}
}
void WorkbenchWindow::FirePerspectiveClosed(IWorkbenchPage::Pointer page,
IPerspectiveDescriptor::Pointer perspective)
{
// UIListenerLogging.logPerspectiveEvent(this, page, perspective,
// UIListenerLogging.PLE_PERSP_CLOSED);
perspectiveEvents.perspectiveClosed(page, perspective);
}
void WorkbenchWindow::FirePerspectiveOpened(IWorkbenchPage::Pointer page,
IPerspectiveDescriptor::Pointer perspective)
{
// UIListenerLogging.logPerspectiveEvent(this, page, perspective,
// UIListenerLogging.PLE_PERSP_OPENED);
perspectiveEvents.perspectiveOpened(page, perspective);
}
void WorkbenchWindow::FirePerspectiveSavedAs(IWorkbenchPage::Pointer page,
IPerspectiveDescriptor::Pointer oldPerspective,
IPerspectiveDescriptor::Pointer newPerspective)
{
// UIListenerLogging.logPerspectiveSavedAs(this, page, oldPerspective,
// newPerspective);
perspectiveEvents.perspectiveSavedAs(page, oldPerspective, newPerspective);
}
void WorkbenchWindow::FillActionBars(ActionBarAdvisor::FillFlags flags)
{
// Workbench workbench = getWorkbenchImpl();
// workbench.largeUpdateStart();
//try {
this->GetActionBarAdvisor()->FillActionBars(flags);
IMenuService* menuService = serviceLocator->GetService();
menuService->PopulateContributionManager(dynamic_cast(GetActionBars()->GetMenuManager()),
MenuUtil::MAIN_MENU);
// ICoolBarManager coolbar = getActionBars().getCoolBarManager();
// if (coolbar != null)
// {
// menuService.populateContributionManager(
// (ContributionManager) coolbar,
// MenuUtil.MAIN_TOOLBAR);
// }
// } finally {
// workbench.largeUpdateEnd();
// }
}
QPoint WorkbenchWindow::GetInitialSize()
{
return this->GetWindowConfigurer()->GetInitialSize();
}
bool WorkbenchWindow::Close()
{
//BERRY_INFO << "WorkbenchWindow::Close()";
-
- if (controlResizeListener)
- {
- Tweaklets::Get(GuiWidgetsTweaklet::KEY)->RemoveControlListener(GetShell()->GetControl(), controlResizeListener);
- }
-
bool ret = false;
//BusyIndicator.showWhile(null, new Runnable() {
// public void run() {
ret = this->BusyClose();
// }
// });
-
- if (!ret && controlResizeListener)
- {
- Tweaklets::Get(GuiWidgetsTweaklet::KEY)->AddControlListener(GetShell()->GetControl(), controlResizeListener);
- }
-
return ret;
}
bool WorkbenchWindow::BusyClose()
{
// Whether the window was actually closed or not
bool windowClosed = false;
// Setup internal flags to indicate window is in
// progress of closing and no update should be done.
closing = true;
updateDisabled = true;
try
{
// Only do the check if it is OK to close if we are not closing
// via the workbench as the workbench will check this itself.
Workbench* workbench = this->GetWorkbenchImpl();
std::size_t count = workbench->GetWorkbenchWindowCount();
// also check for starting - if the first window dies on startup
// then we'll need to open a default window.
if (!workbench->IsStarting() && !workbench->IsClosing() && count <= 1
&& workbench->GetWorkbenchConfigurer() ->GetExitOnLastWindowClose())
{
windowClosed = workbench->Close();
}
else
{
if (this->OkToClose())
{
windowClosed = this->HardClose();
}
}
} catch (std::exception& exc)
{
if (!windowClosed)
{
// Reset the internal flags if window was not closed.
closing = false;
updateDisabled = false;
}
throw exc;
}
// if (windowClosed && tracker != null) {
// tracker.close();
// }
return windowClosed;
}
void WorkbenchWindow::MakeVisible()
{
Shell::Pointer shell = GetShell();
if (shell)
{
// see bug 96700 and bug 4414 for a discussion on the use of open()
// here
shell->Open();
}
}
bool WorkbenchWindow::OkToClose()
{
// Save all of the editors.
if (!this->GetWorkbenchImpl()->IsClosing())
{
if (!this->SaveAllPages(true))
{
return false;
}
}
return true;
}
bool WorkbenchWindow::SaveAllPages(bool bConfirm)
{
bool bRet = true;
PageList::iterator itr = pageList.Begin();
while (bRet && itr != pageList.End())
{
bRet = (*itr)->SaveAllEditors(bConfirm);
++itr;
}
return bRet;
}
bool WorkbenchWindow::HardClose()
{
std::exception exc;
bool exceptionOccured = false;
try
{
// Clear the action sets, fix for bug 27416.
//getActionPresentation().clearActionSets();
// Remove the handler submissions. Bug 64024.
/*
final IWorkbench workbench = getWorkbench();
final IHandlerService handlerService = (IHandlerService) workbench.getService(IHandlerService.class);
handlerService.deactivateHandlers(handlerActivations);
final Iterator activationItr = handlerActivations.iterator();
while (activationItr.hasNext()) {
final IHandlerActivation activation = (IHandlerActivation) activationItr
.next();
activation.getHandler().dispose();
}
handlerActivations.clear();
globalActionHandlersByCommandId.clear();
*/
// Remove the enabled submissions. Bug 64024.
- /*
- final IContextService contextService = (IContextService) workbench.getService(IContextService.class);
- contextService.unregisterShell(getShell());
- */
+ //IContextService* contextService = this->GetWorkbench()->GetService();
+ //contextService->UnregisterShell(this->GetShell());
this->CloseAllPages();
this->FireWindowClosed();
// time to wipe out our populate
/*
IMenuService menuService = (IMenuService) workbench
.getService(IMenuService.class);
menuService
.releaseContributions(((ContributionManager) getActionBars()
.getMenuManager()));
ICoolBarManager coolbar = getActionBars().getCoolBarManager();
if (coolbar != null) {
menuService
.releaseContributions(((ContributionManager) coolbar));
}
*/
//getActionBarAdvisor().dispose();
//getWindowAdvisor().dispose();
//detachedWindowShells.dispose();
delete windowAdvisor;
windowAdvisor = 0;
// Null out the progress region. Bug 64024.
//progressRegion = null;
// Remove drop targets
/*
DragUtil.removeDragTarget(null, trimDropTarget);
DragUtil.removeDragTarget(getShell(), trimDropTarget);
trimDropTarget = null;
if (trimMgr2 != null) {
trimMgr2.dispose();
trimMgr2 = null;
}
if (trimContributionMgr != null) {
trimContributionMgr.dispose();
trimContributionMgr = null;
}
*/
} catch (std::exception& e)
{
exc = e;
exceptionOccured = true;
}
bool result = Window::Close();
// Bring down all of the services ... after the window goes away
serviceLocator->Dispose();
//menuRestrictions.clear();
if (exceptionOccured)
throw exc;
return result;
}
void WorkbenchWindow::CloseAllPages()
{
// Deactivate active page.
this->SetActivePage(IWorkbenchPage::Pointer(0));
// Clone and deref all so that calls to getPages() returns
// empty list (if called by pageClosed event handlers)
PageList oldList = pageList;
pageList.Clear();
// Close all.
for (PageList::iterator itr = oldList.Begin(); itr != oldList.End(); ++itr)
{
partService.PageClosed(*itr);
//(*itr)->FirePageClosed(page);
//page.dispose();
}
if (!closing)
{
this->ShowEmptyWindowContents();
}
}
WWinActionBars* WorkbenchWindow::GetActionBars()
{
if (actionBars.IsNull())
{
actionBars = new WWinActionBars(this);
}
return actionBars.GetPointer();
}
void WorkbenchWindow::SetPerspectiveExcludeList(const QStringList& v)
{
perspectiveExcludeList = v;
}
QStringList WorkbenchWindow::GetPerspectiveExcludeList() const
{
return perspectiveExcludeList;
}
void WorkbenchWindow::SetViewExcludeList(const QStringList& v)
{
viewExcludeList = v;
}
QStringList WorkbenchWindow::GetViewExcludeList() const
{
return viewExcludeList;
}
IWorkbenchPage::Pointer WorkbenchWindow::GetPage(int i) const
{
QList pages = pageList.GetPages();
int j = 0;
for (auto it = pages.begin(); it!=pages.end(); it++, j++)
{
if (j==i)
{
return *it;
}
}
return IWorkbenchPage::Pointer();
}
IWorkbenchPage::Pointer WorkbenchWindow::GetActivePage() const
{
return pageList.GetActive();
}
IWorkbench* WorkbenchWindow::GetWorkbench()
{
return PlatformUI::GetWorkbench();
}
IPartService* WorkbenchWindow::GetPartService()
{
return &partService;
}
ISelectionService* WorkbenchWindow::GetSelectionService()
{
return partService.GetSelectionService();
}
bool WorkbenchWindow::GetToolBarVisible() const
{
return GetWindowConfigurer()->GetShowToolBar() && toolBarVisible;
}
bool WorkbenchWindow::GetPerspectiveBarVisible() const
{
return GetWindowConfigurer()->GetShowPerspectiveBar() && perspectiveBarVisible;
}
bool WorkbenchWindow::GetStatusLineVisible() const
{
return GetWindowConfigurer()->GetShowStatusLine() && statusLineVisible;
}
void WorkbenchWindow::AddPropertyChangeListener(IPropertyChangeListener *listener)
{
genericPropertyListeners.AddListener(listener);
}
void WorkbenchWindow::RemovePropertyChangeListener(IPropertyChangeListener *listener)
{
genericPropertyListeners.RemoveListener(listener);
}
bool WorkbenchWindow::IsClosing()
{
return closing || this->GetWorkbenchImpl()->IsClosing();
}
int WorkbenchWindow::Open()
{
if (pageList.IsEmpty())
{
this->ShowEmptyWindowContents();
}
this->FireWindowCreated();
this->GetWindowAdvisor()->OpenIntro();
int result = Window::Open();
// It's time for a layout ... to insure that if TrimLayout
// is in play, it updates all of the trim it's responsible
// for. We have to do this before updating in order to get
// the PerspectiveBar management correct...see defect 137334
//getShell().layout();
this->FireWindowOpened();
// if (perspectiveSwitcher != null) {
// perspectiveSwitcher.updatePerspectiveBar();
// perspectiveSwitcher.updateBarParent();
// }
return result;
}
QWidget* WorkbenchWindow::GetPageComposite()
{
return pageComposite;
}
QWidget *WorkbenchWindow::CreatePageComposite(QWidget *parent)
{
QtControlWidget* pageArea = new QtControlWidget(parent, 0);
pageArea->setObjectName("Page Composite");
new QHBoxLayout(pageArea);
if (qobject_cast (parent) != 0)
qobject_cast (parent)->setCentralWidget(pageArea);
else
parent->layout()->addWidget(pageArea);
// we have to enable visibility to get a proper layout (see bug #1654)
pageArea->setVisible(true);
parent->setVisible(true);
pageComposite = pageArea;
return pageArea;
}
QWidget* WorkbenchWindow::CreateContents(Shell::Pointer parent)
{
// we know from Window.create that the parent is a Shell.
this->GetWindowAdvisor()->CreateWindowContents(parent);
// the page composite must be set by createWindowContents
poco_assert(pageComposite != 0)
; // "createWindowContents must call configurer.createPageComposite"); //$NON-NLS-1$
return pageComposite;
}
void WorkbenchWindow::CreateDefaultContents(Shell::Pointer shell)
{
QMainWindow* mainWindow = qobject_cast(shell->GetControl());
if (GetWindowConfigurer()->GetShowMenuBar() && mainWindow)
{
QMenuBar* menuBar = GetMenuBarManager()->CreateMenuBar(mainWindow);
mainWindow->setMenuBar(menuBar);
}
if (GetWindowConfigurer()->GetShowPerspectiveBar() && mainWindow)
{
mainWindow->addToolBar(new QtPerspectiveSwitcher(IWorkbenchWindow::Pointer(this)));
}
// Create the client composite area (where page content goes).
CreatePageComposite(shell->GetControl());
}
void WorkbenchWindow::CreateTrimWidgets(SmartPointer /*shell*/)
{
// do nothing -- trim widgets are created in CreateDefaultContents
}
bool WorkbenchWindow::UnableToRestorePage(IMemento::Pointer pageMem)
{
QString pageName;
pageMem->GetString(WorkbenchConstants::TAG_LABEL, pageName);
// return new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, 0, NLS.bind(
// WorkbenchMessages.WorkbenchWindow_unableToRestorePerspective,
// pageName), null);
WorkbenchPlugin::Log("Unable to restore perspective: " + pageName);
return false;
}
bool WorkbenchWindow::RestoreState(IMemento::Pointer memento,
IPerspectiveDescriptor::Pointer activeDescriptor)
{
//TODO WorkbenchWindow restore state
poco_assert(GetShell());
// final MultiStatus result = new MultiStatus(PlatformUI.PLUGIN_ID, IStatus.OK,
// WorkbenchMessages.WorkbenchWindow_problemsRestoringWindow, null);
bool result = true;
// Restore the window advisor state.
IMemento::Pointer windowAdvisorState = memento
->GetChild(WorkbenchConstants::TAG_WORKBENCH_WINDOW_ADVISOR);
if (windowAdvisorState)
{
//result.add(getWindowAdvisor().restoreState(windowAdvisorState));
result &= GetWindowAdvisor()->RestoreState(windowAdvisorState);
}
// Restore actionbar advisor state.
IMemento::Pointer actionBarAdvisorState = memento
->GetChild(WorkbenchConstants::TAG_ACTION_BAR_ADVISOR);
if (actionBarAdvisorState)
{
// result.add(getActionBarAdvisor()
// .restoreState(actionBarAdvisorState));
result &= GetActionBarAdvisor()
->RestoreState(actionBarAdvisorState);
}
// Read window's bounds and state.
QRect displayBounds;
// StartupThreading.runWithoutExceptions(new StartupRunnable() {
//
// public void runWithException() {
displayBounds = Tweaklets::Get(GuiWidgetsTweaklet::KEY)->GetScreenSize();
//displayBounds = GetShell()->GetDisplay()->GetBounds();
// }});
// final IMemento fastViewMem = memento
// .getChild(IWorkbenchConstants.TAG_FAST_VIEW_DATA);
// if (fastViewMem != null) {
// if (fastViewBar != null) {
// StartupThreading.runWithoutExceptions(new StartupRunnable() {
//
// public void runWithException() {
// fastViewBar.restoreState(fastViewMem);
// }});
//
// }
// }
int x, y, w, h;
memento->GetInteger(WorkbenchConstants::TAG_X, x);
memento->GetInteger(WorkbenchConstants::TAG_Y, y);
memento->GetInteger(WorkbenchConstants::TAG_WIDTH, w);
memento->GetInteger(WorkbenchConstants::TAG_HEIGHT, h);
QRect shellBounds(x, y, w, h);
if (!shellBounds.isEmpty())
{
// StartupThreading.runWithoutExceptions(new StartupRunnable() {
//
// public void runWithException() {
if (!shellBounds.intersects(displayBounds))
{
QRect clientArea(Tweaklets::Get(GuiWidgetsTweaklet::KEY)->GetAvailableScreenSize());
shellBounds.setX(clientArea.x());
shellBounds.setY(clientArea.y());
}
GetShell()->SetBounds(shellBounds);
// }});
}
QString maximized; memento->GetString(WorkbenchConstants::TAG_MAXIMIZED, maximized);
if (maximized == "true")
{
// StartupThreading.runWithoutExceptions(new StartupRunnable() {
//
// public void runWithException() {
GetShell()->SetMaximized(true);
// }});
}
QString minimized; memento->GetString(WorkbenchConstants::TAG_MINIMIZED, minimized);
if (minimized == "true")
{
// getShell().setMinimized(true);
}
// // restore the width of the perspective bar
// if (perspectiveSwitcher != null) {
// perspectiveSwitcher.restoreState(memento);
// }
// // Restore the cool bar order by creating all the tool bar contribution
// // items
// // This needs to be done before pages are created to ensure proper
// // canonical creation
// // of cool items
// final ICoolBarManager2 coolBarMgr = (ICoolBarManager2) getCoolBarManager2();
// if (coolBarMgr != null) {
// IMemento coolBarMem = memento
// .getChild(IWorkbenchConstants.TAG_COOLBAR_LAYOUT);
// if (coolBarMem != null) {
// // Check if the layout is locked
// final Integer lockedInt = coolBarMem
// .getInteger(IWorkbenchConstants.TAG_LOCKED);
// StartupThreading.runWithoutExceptions(new StartupRunnable(){
//
// public void runWithException() {
// if ((lockedInt != null) && (lockedInt.intValue() == 1)) {
// coolBarMgr.setLockLayout(true);
// } else {
// coolBarMgr.setLockLayout(false);
// }
// }});
//
// // The new layout of the cool bar manager
// ArrayList coolBarLayout = new ArrayList();
// // Traverse through all the cool item in the memento
// IMemento contributionMems[] = coolBarMem
// .getChildren(IWorkbenchConstants.TAG_COOLITEM);
// for (int i = 0; i < contributionMems.length; i++) {
// IMemento contributionMem = contributionMems[i];
// String type = contributionMem
// .getString(IWorkbenchConstants.TAG_ITEM_TYPE);
// if (type == null) {
// // Do not recognize that type
// continue;
// }
// String id = contributionMem
// .getString(IWorkbenchConstants.TAG_ID);
//
// // Prevent duplicate items from being read back in.
// IContributionItem existingItem = coolBarMgr.find(id);
// if ((id != null) && (existingItem != null)) {
// if (Policy.DEBUG_TOOLBAR_DISPOSAL) {
// System.out
// .println("Not loading duplicate cool bar item: " + id); //$NON-NLS-1$
// }
// coolBarLayout.add(existingItem);
// continue;
// }
// IContributionItem newItem = null;
// if (type.equals(IWorkbenchConstants.TAG_TYPE_SEPARATOR)) {
// if (id != null) {
// newItem = new Separator(id);
// } else {
// newItem = new Separator();
// }
// } else if (id != null) {
// if (type
// .equals(IWorkbenchConstants.TAG_TYPE_GROUPMARKER)) {
// newItem = new GroupMarker(id);
//
// } else if (type
// .equals(IWorkbenchConstants.TAG_TYPE_TOOLBARCONTRIBUTION)
// || type
// .equals(IWorkbenchConstants.TAG_TYPE_PLACEHOLDER)) {
//
// // Get Width and height
// Integer width = contributionMem
// .getInteger(IWorkbenchConstants.TAG_ITEM_X);
// Integer height = contributionMem
// .getInteger(IWorkbenchConstants.TAG_ITEM_Y);
// // Look for the object in the current cool bar
// // manager
// IContributionItem oldItem = coolBarMgr.find(id);
// // If a tool bar contribution item already exists
// // for this id then use the old object
// if (oldItem != null) {
// newItem = oldItem;
// } else {
// IActionBarPresentationFactory actionBarPresentation = getActionBarPresentationFactory();
// newItem = actionBarPresentation.createToolBarContributionItem(
// actionBarPresentation.createToolBarManager(), id);
// if (type
// .equals(IWorkbenchConstants.TAG_TYPE_PLACEHOLDER)) {
// IToolBarContributionItem newToolBarItem = (IToolBarContributionItem) newItem;
// if (height != null) {
// newToolBarItem.setCurrentHeight(height
// .intValue());
// }
// if (width != null) {
// newToolBarItem.setCurrentWidth(width
// .intValue());
// }
// newItem = new PlaceholderContributionItem(
// newToolBarItem);
// }
// // make it invisible by default
// newItem.setVisible(false);
// // Need to add the item to the cool bar manager
// // so that its canonical order can be preserved
// IContributionItem refItem = findAlphabeticalOrder(
// IWorkbenchActionConstants.MB_ADDITIONS,
// id, coolBarMgr);
// if (refItem != null) {
// coolBarMgr.insertAfter(refItem.getId(),
// newItem);
// } else {
// coolBarMgr.add(newItem);
// }
// }
// // Set the current height and width
// if ((width != null)
// && (newItem instanceof IToolBarContributionItem)) {
// ((IToolBarContributionItem) newItem)
// .setCurrentWidth(width.intValue());
// }
// if ((height != null)
// && (newItem instanceof IToolBarContributionItem)) {
// ((IToolBarContributionItem) newItem)
// .setCurrentHeight(height.intValue());
// }
// }
// }
// // Add new item into cool bar manager
// if (newItem != null) {
// coolBarLayout.add(newItem);
// newItem.setParent(coolBarMgr);
// coolBarMgr.markDirty();
// }
// }
//
// // We need to check if we have everything we need in the layout.
// boolean newlyAddedItems = false;
// IContributionItem[] existingItems = coolBarMgr.getItems();
// for (int i = 0; i < existingItems.length && !newlyAddedItems; i++) {
// IContributionItem existingItem = existingItems[i];
//
// /*
// * This line shouldn't be necessary, but is here for
// * robustness.
// */
// if (existingItem == null) {
// continue;
// }
//
// boolean found = false;
// Iterator layoutItemItr = coolBarLayout.iterator();
// while (layoutItemItr.hasNext()) {
// IContributionItem layoutItem = (IContributionItem) layoutItemItr
// .next();
// if ((layoutItem != null)
// && (layoutItem.equals(existingItem))) {
// found = true;
// break;
// }
// }
//
// if (!found) {
// if (existingItem != null) {
// newlyAddedItems = true;
// }
// }
// }
//
// // Set the cool bar layout to the given layout.
// if (!newlyAddedItems) {
// final IContributionItem[] itemsToSet = new IContributionItem[coolBarLayout
// .size()];
// coolBarLayout.toArray(itemsToSet);
// StartupThreading
// .runWithoutExceptions(new StartupRunnable() {
//
// public void runWithException() {
// coolBarMgr.setItems(itemsToSet);
// }
// });
// }
//
// } else {
// // For older workbenchs
// coolBarMem = memento
// .getChild(IWorkbenchConstants.TAG_TOOLBAR_LAYOUT);
// if (coolBarMem != null) {
// // Restore an older layout
// restoreOldCoolBar(coolBarMem);
// }
// }
// }
// Recreate each page in the window.
IWorkbenchPage::Pointer newActivePage;
QList pageArray = memento
->GetChildren(WorkbenchConstants::TAG_PAGE);
for (int i = 0; i < pageArray.size(); i++)
{
IMemento::Pointer pageMem = pageArray[i];
QString strFocus; pageMem->GetString(WorkbenchConstants::TAG_FOCUS, strFocus);
if (strFocus.isEmpty())
{
continue;
}
// Get the input factory.
IAdaptable* input = 0;
IMemento::Pointer inputMem = pageMem->GetChild(WorkbenchConstants::TAG_INPUT);
if (inputMem)
{
QString factoryID; inputMem->GetString(WorkbenchConstants::TAG_FACTORY_ID, factoryID);
if (factoryID.isEmpty())
{
WorkbenchPlugin
::Log("Unable to restore page - no input factory ID.");
//result.add(unableToRestorePage(pageMem));
result &= UnableToRestorePage(pageMem);
continue;
}
// try {
// UIStats.start(UIStats.RESTORE_WORKBENCH,
// "WorkbenchPageFactory"); //$NON-NLS-1$
// StartupThreading
// .runWithoutExceptions(new StartupRunnable() {
//
// public void runWithException() throws Throwable {
// IElementFactory factory = PlatformUI
// .getWorkbench().getElementFactory(
// factoryID);
// if (factory == null) {
// WorkbenchPlugin
// .log("Unable to restore page - cannot instantiate input factory: " + factoryID); //$NON-NLS-1$
// result
// .add(unableToRestorePage(pageMem));
// return;
// }
//
// // Get the input element.
// input[0] = factory.createElement(inputMem);
// }
// });
//
// if (input[0] == null) {
// WorkbenchPlugin
// .log("Unable to restore page - cannot instantiate input element: " + factoryID); //$NON-NLS-1$
// result.add(unableToRestorePage(pageMem));
// continue;
// }
// } finally {
// UIStats.end(UIStats.RESTORE_WORKBENCH, factoryID,
// "WorkbenchPageFactory"); //$NON-NLS-1$
// }
}
// Open the perspective.
IAdaptable* finalInput = input;
WorkbenchPage::Pointer newPage;
try
{
// StartupThreading.runWithWorkbenchExceptions(new StartupRunnable(){
//
// public void runWithException() throws WorkbenchException {
newPage = new WorkbenchPage(this, finalInput);
// }});
//result.add(newPage[0].restoreState(pageMem, activeDescriptor));
result &= newPage->RestoreState(pageMem, activeDescriptor);
pageList.Add(newPage);
// StartupThreading.runWithoutExceptions(new StartupRunnable() {
//
// public void runWithException() throws Throwable {
partService.PageOpened(newPage);
// firePageOpened(newPage[0]);
// }});
}
catch (const WorkbenchException& e)
{
WorkbenchPlugin::Log(
"Unable to restore perspective - constructor failed.", e); //$NON-NLS-1$
//result.add(e.getStatus());
continue;
}
if (!strFocus.isEmpty())
{
newActivePage = newPage;
}
}
// If there are no pages create a default.
if (pageList.IsEmpty())
{
try
{
const QString defPerspID = this->GetWorkbenchImpl()->GetPerspectiveRegistry()
->GetDefaultPerspective();
if (!defPerspID.isEmpty())
{
WorkbenchPage::Pointer newPage;
//StartupThreading.runWithWorkbenchExceptions(new StartupRunnable() {
// public void runWithException() throws Throwable {
newPage = new WorkbenchPage(this, defPerspID,
this->GetDefaultPageInput());
// }});
pageList.Add(newPage);
//StartupThreading.runWithoutExceptions(new StartupRunnable() {
// public void runWithException() throws Throwable {
// firePageOpened(newPage[0]);
partService.PageOpened(newPage);
// }});
}
}
catch (WorkbenchException& e)
{
WorkbenchPlugin
::Log(
"Unable to create default perspective - constructor failed.", e);
result = false;
//TODO set product name
// String productName = WorkbenchPlugin.getDefault()
// .getProductName();
// if (productName == null) {
// productName = ""; //$NON-NLS-1$
// }
// getShell().setText(productName);
}
}
// Set active page.
if (newActivePage.IsNull())
{
newActivePage = pageList.GetNextActive().Cast();
}
//StartupThreading.runWithoutExceptions(new StartupRunnable() {
// public void runWithException() throws Throwable {
this->SetActivePage(newActivePage);
// }});
IMemento::Pointer introMem = memento->GetChild(WorkbenchConstants::TAG_INTRO);
if (introMem) {
// StartupThreading.runWithoutExceptions(new StartupRunnable() {
//
// public void runWithException() throws Throwable {
bool isStandby = false;
introMem->GetBoolean(WorkbenchConstants::TAG_STANDBY, isStandby);
GetWorkbench()->GetIntroManager()->ShowIntro(
IWorkbenchWindow::Pointer(this), isStandby);
// }
// });
}
//
// // Only restore the trim state if we're using the default layout
// if (defaultLayout != null) {
// // Restore the trim state. We pass in the 'root'
// // memento since we have to check for pre-3.2
// // state.
// result.add(restoreTrimState(memento));
// }
return result;
}
IAdaptable* WorkbenchWindow::GetDefaultPageInput()
{
return this->GetWorkbenchImpl()->GetDefaultPageInput();
}
IWorkbenchPage::Pointer WorkbenchWindow::OpenPage(
const QString& perspId, IAdaptable* input)
{
// Run op in busy cursor.
IWorkbenchPage::Pointer result;
//BusyIndicator.showWhile(null, new Runnable() {
// public void run() {
result = this->BusyOpenPage(perspId, input);
// }
return result;
}
SmartPointer WorkbenchWindow::OpenPage(IAdaptable* input)
{
QString perspId = this->GetWorkbenchImpl()->GetDefaultPerspectiveId();
return this->OpenPage(perspId, input);
}
IWorkbenchPage::Pointer WorkbenchWindow::BusyOpenPage(
const QString& perspID, IAdaptable* input)
{
IWorkbenchPage::Pointer newPage;
if (pageList.IsEmpty())
{
newPage = new WorkbenchPage(this, perspID, input);
pageList.Add(newPage);
//this->FirePageOpened(newPage);
partService.PageOpened(newPage);
this->SetActivePage(newPage);
}
else
{
IWorkbenchWindow::Pointer window = this->GetWorkbench()->OpenWorkbenchWindow(perspID, input);
newPage = window->GetActivePage();
}
return newPage;
}
int WorkbenchWindow::GetNumber()
{
return number;
}
void WorkbenchWindow::UpdateActionBars()
{
if (updateDisabled || UpdatesDeferred())
{
return;
}
// updateAll required in order to enable accelerators on pull-down menus
GetMenuBarManager()->Update(false);
//GetToolBarManager()->Update(false);
//GetStatusLineManager()->Update(false);
}
void WorkbenchWindow::LargeUpdateStart()
{
largeUpdates++;
}
void WorkbenchWindow::LargeUpdateEnd()
{
if (--largeUpdates == 0)
{
this->UpdateActionBars();
}
}
void WorkbenchWindow::SetActivePage(IWorkbenchPage::Pointer in)
{
if (this->GetActivePage() == in)
{
return;
}
// 1FVGTNR: ITPUI:WINNT - busy cursor for switching perspectives
//BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() {
// public void run() {
// Deactivate old persp.
WorkbenchPage::Pointer currentPage = pageList.GetActive();
if (currentPage.IsNotNull())
{
currentPage->OnDeactivate();
}
// Activate new persp.
if (in.IsNull() || pageList.Contains(in))
{
pageList.SetActive(in);
}
WorkbenchPage::Pointer newPage = pageList.GetActive();
//Composite parent = getPageComposite();
//StackLayout layout = (StackLayout) parent.getLayout();
if (newPage.IsNotNull())
{
//layout.topControl = newPage.getClientComposite();
//parent.layout();
this->HideEmptyWindowContents();
newPage->OnActivate();
//this->FirePageActivated(newPage);
partService.PageActivated(newPage);
//TODO perspective
if (newPage->GetPerspective() != 0)
{
this->FirePerspectiveActivated(newPage, newPage->GetPerspective());
}
}
else
{
//layout.topControl = null;
//parent.layout();
}
//updateFastViewBar();
if (this->IsClosing())
{
return;
}
updateDisabled = false;
// Update action bars ( implicitly calls updateActionBars() )
//updateActionSets();
//submitGlobalActions();
//if (perspectiveSwitcher != null) {
// perspectiveSwitcher.update(false);
//}
//getMenuManager().update(IAction.TEXT);
// }
//});
}
MenuManager *WorkbenchWindow::GetMenuManager() const
{
return this->GetMenuBarManager();
}
bool WorkbenchWindow::SaveState(IMemento::Pointer memento)
{
// MultiStatus result = new MultiStatus(PlatformUI.PLUGIN_ID, IStatus.OK,
// WorkbenchMessages.WorkbenchWindow_problemsSavingWindow, null);
bool result = true;
// Save the window's state and bounds.
if (GetShell()->GetMaximized() || asMaximizedState)
{
memento->PutString(WorkbenchConstants::TAG_MAXIMIZED, "true");
}
if (GetShell()->GetMinimized())
{
memento->PutString(WorkbenchConstants::TAG_MINIMIZED, "true");
}
if (normalBounds.isEmpty())
{
normalBounds = GetShell()->GetBounds();
}
// IMemento fastViewBarMem = memento
// .createChild(IWorkbenchConstants.TAG_FAST_VIEW_DATA);
// if (fastViewBar != null) {
// fastViewBar.saveState(fastViewBarMem);
// }
memento->PutInteger(WorkbenchConstants::TAG_X, normalBounds.x());
memento->PutInteger(WorkbenchConstants::TAG_Y, normalBounds.y());
memento->PutInteger(WorkbenchConstants::TAG_WIDTH, normalBounds.width());
memento->PutInteger(WorkbenchConstants::TAG_HEIGHT, normalBounds.height());
IWorkbenchPage::Pointer activePage = GetActivePage();
if (activePage
&& activePage->FindView(IntroConstants::INTRO_VIEW_ID))
{
IMemento::Pointer introMem = memento
->CreateChild(WorkbenchConstants::TAG_INTRO);
bool isStandby = GetWorkbench()->GetIntroManager()
->IsIntroStandby(GetWorkbench()->GetIntroManager()->GetIntro());
introMem->PutBoolean(WorkbenchConstants::TAG_STANDBY, isStandby);
}
// // save the width of the perspective bar
// IMemento persBarMem = memento
// .createChild(IWorkbenchConstants.TAG_PERSPECTIVE_BAR);
// if (perspectiveSwitcher != null) {
// perspectiveSwitcher.saveState(persBarMem);
// }
// // / Save the order of the cool bar contribution items
// ICoolBarManager2 coolBarMgr = (ICoolBarManager2) getCoolBarManager2();
// if (coolBarMgr != null) {
// coolBarMgr.refresh();
// IMemento coolBarMem = memento
// .createChild(IWorkbenchConstants.TAG_COOLBAR_LAYOUT);
// if (coolBarMgr.getLockLayout() == true) {
// coolBarMem.putInteger(IWorkbenchConstants.TAG_LOCKED, 1);
// } else {
// coolBarMem.putInteger(IWorkbenchConstants.TAG_LOCKED, 0);
// }
// IContributionItem[] items = coolBarMgr.getItems();
// for (int i = 0; i < items.length; i++) {
// IMemento coolItemMem = coolBarMem
// .createChild(IWorkbenchConstants.TAG_COOLITEM);
// IContributionItem item = items[i];
// // The id of the contribution item
// if (item.getId() != null) {
// coolItemMem.putString(IWorkbenchConstants.TAG_ID, item
// .getId());
// }
// // Write out type and size if applicable
// if (item.isSeparator()) {
// coolItemMem.putString(IWorkbenchConstants.TAG_ITEM_TYPE,
// IWorkbenchConstants.TAG_TYPE_SEPARATOR);
// } else if (item.isGroupMarker() && !item.isSeparator()) {
// coolItemMem.putString(IWorkbenchConstants.TAG_ITEM_TYPE,
// IWorkbenchConstants.TAG_TYPE_GROUPMARKER);
// } else {
// if (item instanceof PlaceholderContributionItem) {
// coolItemMem.putString(
// IWorkbenchConstants.TAG_ITEM_TYPE,
// IWorkbenchConstants.TAG_TYPE_PLACEHOLDER);
// } else {
// // Store the identifier.
// coolItemMem
// .putString(
// IWorkbenchConstants.TAG_ITEM_TYPE,
// IWorkbenchConstants.TAG_TYPE_TOOLBARCONTRIBUTION);
// }
//
// /*
// * Retrieve a reasonable approximation of the height and
// * width, if possible.
// */
// final int height;
// final int width;
// if (item instanceof IToolBarContributionItem) {
// IToolBarContributionItem toolBarItem = (IToolBarContributionItem) item;
// toolBarItem.saveWidgetState();
// height = toolBarItem.getCurrentHeight();
// width = toolBarItem.getCurrentWidth();
// } else if (item instanceof PlaceholderContributionItem) {
// PlaceholderContributionItem placeholder = (PlaceholderContributionItem) item;
// height = placeholder.getHeight();
// width = placeholder.getWidth();
// } else {
// height = -1;
// width = -1;
// }
//
// // Store the height and width.
// coolItemMem.putInteger(IWorkbenchConstants.TAG_ITEM_X,
// width);
// coolItemMem.putInteger(IWorkbenchConstants.TAG_ITEM_Y,
// height);
// }
// }
// }
// Save each page.
for (PageList::iterator itr = pageList.Begin();
itr != pageList.End(); ++itr)
{
WorkbenchPage::Pointer page = itr->Cast();
// Save perspective.
IMemento::Pointer pageMem = memento
->CreateChild(WorkbenchConstants::TAG_PAGE);
pageMem->PutString(WorkbenchConstants::TAG_LABEL, page->GetLabel());
//result.add(page.saveState(pageMem));
result &= page->SaveState(pageMem);
if (page == GetActivePage().Cast())
{
pageMem->PutString(WorkbenchConstants::TAG_FOCUS, "true");
}
// // Get the input.
// IAdaptable* input = page->GetInput();
// if (input != 0) {
// IPersistableElement persistable = (IPersistableElement) Util.getAdapter(input,
// IPersistableElement.class);
// if (persistable == null) {
// WorkbenchPlugin
// .log("Unable to save page input: " //$NON-NLS-1$
// + input
// + ", because it does not adapt to IPersistableElement"); //$NON-NLS-1$
// } else {
// // Save input.
// IMemento inputMem = pageMem
// .createChild(IWorkbenchConstants.TAG_INPUT);
// inputMem.putString(IWorkbenchConstants.TAG_FACTORY_ID,
// persistable.getFactoryId());
// persistable.saveState(inputMem);
// }
// }
}
// Save window advisor state.
IMemento::Pointer windowAdvisorState = memento
->CreateChild(WorkbenchConstants::TAG_WORKBENCH_WINDOW_ADVISOR);
//result.add(getWindowAdvisor().saveState(windowAdvisorState));
result &= GetWindowAdvisor()->SaveState(windowAdvisorState);
// Save actionbar advisor state.
IMemento::Pointer actionBarAdvisorState = memento
->CreateChild(WorkbenchConstants::TAG_ACTION_BAR_ADVISOR);
//result.add(getActionBarAdvisor().saveState(actionBarAdvisorState));
result &= GetActionBarAdvisor()->SaveState(actionBarAdvisorState);
// // Only save the trim state if we're using the default layout
// if (defaultLayout != null) {
// IMemento trimState = memento.createChild(IWorkbenchConstants.TAG_TRIM);
// result.add(saveTrimState(trimState));
// }
return result;
}
WorkbenchWindowConfigurer::Pointer WorkbenchWindow::GetWindowConfigurer() const
{
if (windowConfigurer.IsNull())
{
// lazy initialize
windowConfigurer = new WorkbenchWindowConfigurer(WorkbenchWindow::Pointer(const_cast(this)));
}
return windowConfigurer;
}
bool WorkbenchWindow::CanHandleShellCloseEvent()
{
if (!Window::CanHandleShellCloseEvent())
{
return false;
}
// let the advisor or other interested parties
// veto the user's explicit request to close the window
return FireWindowShellClosing();
}
void WorkbenchWindow::ConfigureShell(Shell::Pointer shell)
{
Window::ConfigureShell(shell);
detachedWindowShells = new ShellPool(shell, Constants::TITLE
| Constants::MAX | Constants::CLOSE | Constants::RESIZE | Constants::BORDER );
QString title = this->GetWindowConfigurer()->BasicGetTitle();
if (!title.isEmpty())
{
shell->SetText(title);
}
- // final IWorkbench workbench = getWorkbench();
+ //IWorkbench* workbench = this->GetWorkbench();
// workbench.getHelpSystem().setHelp(shell,
// IWorkbenchHelpContextIds.WORKBENCH_WINDOW);
- // final IContextService contextService = (IContextService) getWorkbench().getService(IContextService.class);
- // contextService.registerShell(shell, IContextService.TYPE_WINDOW);
+ //IContextService* contextService = workbench->GetService();
+ //contextService->RegisterShell(shell, IContextService::TYPE_WINDOW);
- this->TrackShellActivation(shell);
- this->TrackShellResize(shell);
+ shell->GetControl()->installEventFilter(&resizeEventFilter);
}
ShellPool::Pointer WorkbenchWindow::GetDetachedWindowPool()
{
return detachedWindowShells;
}
WorkbenchAdvisor* WorkbenchWindow::GetAdvisor()
{
return this->GetWorkbenchImpl()->GetAdvisor();
}
WorkbenchWindowAdvisor* WorkbenchWindow::GetWindowAdvisor()
{
if (windowAdvisor == 0)
{
windowAdvisor = this->GetAdvisor()->CreateWorkbenchWindowAdvisor(this->GetWindowConfigurer());
poco_check_ptr(windowAdvisor);
}
return windowAdvisor;
}
ActionBarAdvisor::Pointer WorkbenchWindow::GetActionBarAdvisor()
{
if (actionBarAdvisor.IsNull())
{
actionBarAdvisor = this->GetWindowAdvisor()->CreateActionBarAdvisor(this->GetWindowConfigurer()->GetActionBarConfigurer());
poco_assert(actionBarAdvisor.IsNotNull());
}
return actionBarAdvisor;
}
Workbench* WorkbenchWindow::GetWorkbenchImpl()
{
return dynamic_cast(this->GetWorkbench());
}
void WorkbenchWindow::ShowEmptyWindowContents()
{
if (!emptyWindowContentsCreated)
{
QWidget* parent = this->GetPageComposite();
emptyWindowContents = this->GetWindowAdvisor()->CreateEmptyWindowContents(
parent);
emptyWindowContentsCreated = true;
// // force the empty window composite to be layed out
// ((StackLayout) parent.getLayout()).topControl = emptyWindowContents;
// parent.layout();
}
}
void WorkbenchWindow::HideEmptyWindowContents()
{
if (emptyWindowContentsCreated)
{
if (emptyWindowContents != 0)
{
Tweaklets::Get(GuiWidgetsTweaklet::KEY)->Dispose(emptyWindowContents);
emptyWindowContents = 0;
//this->GetPageComposite().layout();
}
emptyWindowContentsCreated = false;
}
}
WorkbenchWindow::ServiceLocatorOwner::ServiceLocatorOwner(WorkbenchWindow* wnd)
: window(wnd)
{
}
void WorkbenchWindow::ServiceLocatorOwner::Dispose()
{
Shell::Pointer shell = window->GetShell();
if (shell != 0)
{
window->Close();
}
}
bool WorkbenchWindow::PageList::Add(IWorkbenchPage::Pointer object)
{
pagesInCreationOrder.push_back(object);
pagesInActivationOrder.push_front(object);
// It will be moved to top only when activated.
return true;
}
WorkbenchWindow::PageList::iterator WorkbenchWindow::PageList::Begin()
{
return pagesInCreationOrder.begin();
}
WorkbenchWindow::PageList::iterator WorkbenchWindow::PageList::End()
{
return pagesInCreationOrder.end();
}
bool WorkbenchWindow::PageList::Contains(IWorkbenchPage::Pointer object)
{
return std::find(pagesInCreationOrder.begin(), pagesInCreationOrder.end(),
object) != pagesInCreationOrder.end();
}
bool WorkbenchWindow::PageList::Remove(IWorkbenchPage::Pointer object)
{
if (active == object)
{
active = 0;
}
pagesInActivationOrder.removeAll(object);
const int origSize = pagesInCreationOrder.size();
pagesInCreationOrder.removeAll(object);
return origSize != pagesInCreationOrder.size();
}
void WorkbenchWindow::PageList::Clear()
{
pagesInCreationOrder.clear();
pagesInActivationOrder.clear();
active = 0;
}
bool WorkbenchWindow::PageList::IsEmpty()
{
return pagesInCreationOrder.empty();
}
QList WorkbenchWindow::PageList::GetPages() const
{
return pagesInCreationOrder;
}
void WorkbenchWindow::PageList::SetActive(IWorkbenchPage::Pointer page)
{
if (active == page)
{
return;
}
active = page;
if (page.IsNotNull())
{
pagesInActivationOrder.removeAll(page);
pagesInActivationOrder.push_back(page);
}
}
WorkbenchPage::Pointer WorkbenchWindow::PageList::GetActive() const
{
return active.Cast();
}
WorkbenchPage::Pointer WorkbenchWindow::PageList::GetNextActive()
{
if (active.IsNull())
{
if (pagesInActivationOrder.empty())
{
return WorkbenchPage::Pointer(0);
}
return pagesInActivationOrder.back().Cast();
}
if (pagesInActivationOrder.size() < 2)
{
return WorkbenchPage::Pointer(0);
}
return pagesInActivationOrder.at(pagesInActivationOrder.size()-2).Cast();
}
-WorkbenchWindow::ShellActivationListener::ShellActivationListener(WorkbenchWindow::Pointer w) :
-window(w)
+bool WorkbenchWindow::UpdatesDeferred() const
+{
+ return largeUpdates > 0;
+}
+
+void WorkbenchWindow::InitializeDefaultServices()
+{
+ workbenchLocationService.reset(
+ new WorkbenchLocationService(IServiceScopes::WINDOW_SCOPE, GetWorkbench(), this, NULL, 1));
+ workbenchLocationService->Register();
+ serviceLocator->RegisterService(workbenchLocationService.data());
+
+ //ActionCommandMappingService* mappingService = new ActionCommandMappingService();
+ //serviceLocator->RegisterService(IActionCommandMappingService, mappingService);
+}
+
+QSet > WorkbenchWindow::GetMenuRestrictions() const
+{
+ return QSet >();
+}
+
+void WorkbenchWindow::FirePropertyChanged(const QString& property, const Object::Pointer& oldValue,
+ const Object::Pointer& newValue)
+{
+ PropertyChangeEvent::Pointer event(new PropertyChangeEvent(Object::Pointer(this), property, oldValue, newValue));
+ genericPropertyListeners.propertyChange(event);
+}
+
+WorkbenchWindow::ShellEventFilter::ShellEventFilter(WorkbenchWindow* window)
+ : window(window)
{
}
-void WorkbenchWindow::ShellActivationListener::ShellActivated(const ShellEvent::Pointer& /*event*/)
+bool WorkbenchWindow::ShellEventFilter::eventFilter(QObject* watched, QEvent* event)
+{
+ QEvent::Type eventType = event->type();
+ if (eventType == QEvent::Move || eventType == QEvent::Resize)
+ {
+ QWidget* widget = static_cast(watched);
+ QRect newBounds = widget->geometry();
+ if (eventType == QEvent::Move)
+ {
+ newBounds.setTopLeft(static_cast(event)->pos());
+ }
+ else if(eventType == QEvent::Resize)
+ {
+ newBounds.setSize(static_cast(event)->size());
+ }
+ this->SaveBounds(newBounds);
+ }
+ else if (eventType == QEvent::WindowActivate)
+ {
+ this->ShellActivated();
+ }
+ else if (eventType == QEvent::WindowDeactivate)
+ {
+ this->ShellDeactivated();
+ }
+
+ return false;
+}
+
+void WorkbenchWindow::ShellEventFilter::SaveBounds(const QRect& newBounds)
+{
+ Shell::Pointer shell = window->GetShell();
+ if (shell == 0)
+ {
+ return;
+ }
+ // if (shell->IsDisposed())
+ // {
+ // return;
+ // }
+ if (shell->GetMinimized())
+ {
+ return;
+ }
+ if (shell->GetMaximized())
+ {
+ window->asMaximizedState = true;
+ return;
+ }
+ window->asMaximizedState = false;
+ window->normalBounds = newBounds;
+}
+
+void WorkbenchWindow::ShellEventFilter::ShellActivated()
{
WorkbenchWindow::Pointer wnd(window);
wnd->shellActivated = true;
wnd->serviceLocator->Activate();
wnd->GetWorkbenchImpl()->SetActivatedWindow(wnd);
WorkbenchPage::Pointer currentPage = wnd->GetActivePage().Cast();
if (currentPage != 0)
{
IWorkbenchPart::Pointer part = currentPage->GetActivePart();
if (part != 0)
{
PartSite::Pointer site = part->GetSite().Cast();
site->GetPane()->ShellActivated();
}
IEditorPart::Pointer editor = currentPage->GetActiveEditor();
if (editor != 0)
{
PartSite::Pointer site = editor->GetSite().Cast();
site->GetPane()->ShellActivated();
}
wnd->GetWorkbenchImpl()->FireWindowActivated(wnd);
}
//liftRestrictions();
}
-void WorkbenchWindow::ShellActivationListener::ShellDeactivated(const ShellEvent::Pointer& /*event*/)
+void WorkbenchWindow::ShellEventFilter::ShellDeactivated()
{
WorkbenchWindow::Pointer wnd(window);
wnd->shellActivated = false;
//imposeRestrictions();
wnd->serviceLocator->Deactivate();
WorkbenchPage::Pointer currentPage = wnd->GetActivePage().Cast();
if (currentPage != 0)
{
IWorkbenchPart::Pointer part = currentPage->GetActivePart();
if (part != 0)
{
PartSite::Pointer site = part->GetSite().Cast();
site->GetPane()->ShellDeactivated();
}
IEditorPart::Pointer editor = currentPage->GetActiveEditor();
if (editor != 0)
{
PartSite::Pointer site = editor->GetSite().Cast();
site->GetPane()->ShellDeactivated();
}
wnd->GetWorkbenchImpl()->FireWindowDeactivated(wnd);
}
}
-void WorkbenchWindow::TrackShellActivation(Shell::Pointer shell)
-{
- shellActivationListener.reset(new ShellActivationListener(WorkbenchWindow::Pointer(this)));
- shell->AddShellListener(shellActivationListener.data());
-}
-
-WorkbenchWindow::ControlResizeListener::ControlResizeListener(WorkbenchWindow* w)
-: window(w)
-{
-}
-
-GuiTk::IControlListener::Events::Types WorkbenchWindow::ControlResizeListener::GetEventTypes() const
-{
- return Events::MOVED | Events::RESIZED;
-}
-
-void WorkbenchWindow::
-ControlResizeListener::ControlMoved(GuiTk::ControlEvent::Pointer /*e*/)
-{
- this->SaveBounds();
-}
-
-void WorkbenchWindow::
-ControlResizeListener::ControlResized(GuiTk::ControlEvent::Pointer /*e*/)
-{
- this->SaveBounds();
-}
-
-void WorkbenchWindow::ControlResizeListener::SaveBounds()
-{
- WorkbenchWindow::Pointer wnd(window);
-
- Shell::Pointer shell = wnd->GetShell();
- if (shell == 0)
- {
- return;
- }
- // if (shell->IsDisposed())
- // {
- // return;
- // }
- if (shell->GetMinimized())
- {
- return;
- }
- if (shell->GetMaximized())
- {
- wnd->asMaximizedState = true;
- return;
- }
- wnd->asMaximizedState = false;
- wnd->normalBounds = shell->GetBounds();
-}
-
-void WorkbenchWindow::TrackShellResize(Shell::Pointer newShell)
-{
- controlResizeListener = new ControlResizeListener(this);
- Tweaklets::Get(GuiWidgetsTweaklet::KEY)->AddControlListener(newShell->GetControl(), controlResizeListener);
-}
-
-bool WorkbenchWindow::UpdatesDeferred() const
-{
- return largeUpdates > 0;
-}
-
-void WorkbenchWindow::InitializeDefaultServices()
-{
- workbenchLocationService.reset(
- new WorkbenchLocationService(IServiceScopes::WINDOW_SCOPE, GetWorkbench(), this, NULL, 1));
- workbenchLocationService->Register();
- serviceLocator->RegisterService(workbenchLocationService.data());
-
- //ActionCommandMappingService* mappingService = new ActionCommandMappingService();
- //serviceLocator->RegisterService(IActionCommandMappingService, mappingService);
-}
-
-QSet > WorkbenchWindow::GetMenuRestrictions() const
-{
- return QSet >();
-}
-
-void WorkbenchWindow::FirePropertyChanged(const QString& property, const Object::Pointer& oldValue,
- const Object::Pointer& newValue)
-{
- PropertyChangeEvent::Pointer event(new PropertyChangeEvent(Object::Pointer(this), property, oldValue, newValue));
- genericPropertyListeners.propertyChange(event);
-}
-
}
diff --git a/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryWorkbenchWindow.h b/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryWorkbenchWindow.h
index 0a16cf885d..56e4959585 100644
--- a/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryWorkbenchWindow.h
+++ b/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/berryWorkbenchWindow.h
@@ -1,739 +1,713 @@
/*===================================================================
BlueBerry Platform
Copyright (c) German Cancer Research Center,
Division of Medical and Biological Informatics.
All rights reserved.
This software is distributed WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.
See LICENSE.txt or http://www.mitk.org for details.
===================================================================*/
#ifndef BERRYWORKBENCHWINDOW_H_
#define BERRYWORKBENCHWINDOW_H_
#include "berryIWorkbenchWindow.h"
#include "berryIPerspectiveListener.h"
-#include "guitk/berryGuiTkIControlListener.h"
#include "berryWindow.h"
#include "berryWorkbenchWindowConfigurer.h"
#include "berryShellPool.h"
#include "berryServiceLocator.h"
#include "berryWWinPartService.h"
#include "application/berryWorkbenchAdvisor.h"
#include "application/berryWorkbenchWindowAdvisor.h"
#include "application/berryActionBarAdvisor.h"
#include
#include
namespace berry
{
struct IEvaluationReference;
struct IWorkbench;
struct IWorkbenchPage;
struct IPartService;
struct ISelectionService;
struct IPerspectiveDescriptor;
struct IWorkbenchLocationService;
class Workbench;
class WorkbenchPage;
class WWinActionBars;
/**
* \ingroup org_blueberry_ui_qt
*
*/
class BERRY_UI_QT WorkbenchWindow: public Window, public IWorkbenchWindow
{
public:
/**
* Toolbar visibility change property.
*/
static const QString PROP_TOOLBAR_VISIBLE; // = "toolbarVisible";
/**
* Perspective bar visibility change property.
*/
static const QString PROP_PERSPECTIVEBAR_VISIBLE; // = "perspectiveBarVisible";
/**
* The status line visibility change property. for internal use only.
*/
static const QString PROP_STATUS_LINE_VISIBLE; // = "statusLineVisible";
public:
berryObjectMacro(WorkbenchWindow)
WorkbenchWindow(int number);
~WorkbenchWindow();
Object* GetService(const QString& key);
bool HasService(const QString& key) const;
int Open();
bool Close();
Shell::Pointer GetShell() const;
/**
* @see org.blueberry.ui.IPageService
*/
void AddPerspectiveListener(IPerspectiveListener* l);
/**
* @see org.blueberry.ui.IPageService
*/
void RemovePerspectiveListener(IPerspectiveListener* l);
/**
* @see org.blueberry.ui.IPageService
*/
IPerspectiveListener::Events& GetPerspectiveEvents();
/**
* Returns the action bars for this window.
*/
WWinActionBars* GetActionBars();
SmartPointer GetActivePage() const;
SmartPointer GetPage(int i) const;
void SetPerspectiveExcludeList(const QStringList& v);
QStringList GetPerspectiveExcludeList() const;
void SetViewExcludeList(const QStringList& v);
QStringList GetViewExcludeList() const;
/**
* Sets the active page within the window.
*
* @param in
* identifies the new active page, or null
for no
* active page
*/
void SetActivePage(SmartPointer in);
/**
* Answer the menu manager for this window.
*/
MenuManager* GetMenuManager() const;
IWorkbench* GetWorkbench();
IPartService* GetPartService();
ISelectionService* GetSelectionService();
/**
* @return whether the tool bar should be shown. This is only applicable if
* the window configurer also wishes the cool bar to be visible.
*/
bool GetToolBarVisible() const;
/**
* @return whether the perspective bar should be shown. This is only
* applicable if the window configurer also wishes the perspective
* bar to be visible.
*/
bool GetPerspectiveBarVisible() const;
/**
* @return whether the status line should be shown. This is only applicable if
* the window configurer also wishes status line to be visible.
*/
bool GetStatusLineVisible() const;
/**
* Add a generic property listener.
*
* @param listener the listener to add
*/
void AddPropertyChangeListener(IPropertyChangeListener* listener);
/**
* Removes a generic property listener.
*
* @param listener the listener to remove
*/
void RemovePropertyChangeListener(IPropertyChangeListener* listener);
SmartPointer OpenPage(const QString& perspectiveId,
IAdaptable* input);
SmartPointer OpenPage(IAdaptable* input);
//TODO menu manager
//virtual QWidget* GetMenuManager() = 0;
virtual bool SaveState(IMemento::Pointer memento);
/**
* Called when this window is about to be closed.
*
* Subclasses may overide to add code that returns false
to
* prevent closing under certain conditions.
*/
virtual bool OkToClose();
bool RestoreState(IMemento::Pointer memento, SmartPointer<
IPerspectiveDescriptor> activeDescriptor);
/**
* Returns the number. This corresponds to a page number in a window or a
* window number in the workbench.
*/
int GetNumber();
/**
* update the action bars.
*/
void UpdateActionBars();
/**
*
* Indicates the start of a large update within this window. This is used to
* disable CPU-intensive, change-sensitive services that were temporarily
* disabled in the midst of large changes. This method should always be
* called in tandem with largeUpdateEnd
, and the event loop
* should not be allowed to spin before that method is called.
*
*
* Important: always use with largeUpdateEnd
!
*
*
* @since 3.1
*/
void LargeUpdateStart();
/**
*
* Indicates the end of a large update within this window. This is used to
* re-enable services that were temporarily disabled in the midst of large
* changes. This method should always be called in tandem with
* largeUpdateStart
, and the event loop should not be
* allowed to spin before this method is called.
*
*
* Important: always protect this call by using finally
!
*
*
* @since 3.1
*/
void LargeUpdateEnd();
QSet > GetMenuRestrictions() const;
protected:
friend class WorkbenchConfigurer;
friend class WorkbenchWindowConfigurer;
friend class WorkbenchWindowConfigurer::WindowActionBarConfigurer;
friend class Workbench;
friend class LayoutPartSash;
friend class EditorSashContainer;
friend class WorkbenchPage;
friend class DetachedWindow;
/**
* Returns the GUI dependent page composite, under which the window's
* pages create their controls.
*/
QWidget* GetPageComposite();
/**
* Creates and remembers the client composite, under which workbench pages
* create their controls.
*/
QWidget* CreatePageComposite(QWidget* parent);
/**
* Creates the contents of the workbench window, including trim controls and
* the client composite. This MUST create the client composite via a call to
* createClientComposite
.
*
* @since 3.0
*/
QWidget* CreateContents(Shell::Pointer parent);
/**
* Creates the default contents and layout of the shell.
*
* @param shell
* the shell
*/
virtual void CreateDefaultContents(Shell::Pointer shell);
void CreateTrimWidgets(SmartPointer shell);
/**
* Returns the unique object that applications use to configure this window.
*
* IMPORTANT This method is declared package-private to prevent regular
* plug-ins from downcasting IWorkbenchWindow to WorkbenchWindow and getting
* hold of the workbench window configurer that would allow them to tamper
* with the workbench window. The workbench window configurer is available
* only to the application.
*
*/
WorkbenchWindowConfigurer::Pointer GetWindowConfigurer() const;
bool CanHandleShellCloseEvent();
/*
* @see berry::Window#configureShell(Shell::Pointer)
*/
void ConfigureShell(Shell::Pointer shell);
ShellPool::Pointer GetDetachedWindowPool();
/**
* Fills the window's real action bars.
*
* @param flags
* indicate which bars to fill
*/
void FillActionBars(ActionBarAdvisor::FillFlags flags);
/**
* The WorkbenchWindow
implementation of this method
* delegates to the window configurer.
*
* @since 3.0
*/
QPoint GetInitialSize();
/**
* Returns the default page input for workbench pages opened in this window.
*
* @return the default page input or null
if none
* @since 3.1
*/
IAdaptable* GetDefaultPageInput();
bool IsClosing();
/**
* Opens a new page. Assumes that busy cursor is active.
*
* Note: Since release 2.0, a window is limited to contain at most
* one page. If a page exist in the window when this method is used, then
* another window is created for the new page. Callers are strongly
* recommended to use the IWorkbench.openPerspective
APIs to
* programmatically show a perspective.
*
*/
SmartPointer BusyOpenPage(const QString& perspID,
IAdaptable* input);
bool ClosePage(SmartPointer in, bool save);
/**
* Makes the window visible and frontmost.
*/
void MakeVisible();
/**
* The composite under which workbench pages create their controls.
*/
QWidget* pageComposite;
private:
/**
* Constant indicating that all the actions bars should be filled.
*
* @since 3.0
*/
static const ActionBarAdvisor::FillFlags FILL_ALL_ACTION_BARS;
ShellPool::Pointer detachedWindowShells;
/**
* Object for configuring this workbench window. Lazily initialized to an
* instance unique to this window.
*
* @since 3.0
*/
mutable WorkbenchWindowConfigurer::Pointer windowConfigurer;
WorkbenchWindowAdvisor* windowAdvisor;
ActionBarAdvisor::Pointer actionBarAdvisor;
SmartPointer actionBars;
IPropertyChangeListener::Events genericPropertyListeners;
int number;
/**
* The number of large updates that are currently going on. If this is
* number is greater than zero, then UI updateActionBars is a no-op.
*/
int largeUpdates;
bool closing;
bool shellActivated;
bool updateDisabled;
bool toolBarVisible;
bool perspectiveBarVisible;
bool statusLineVisible;
/**
* The map of services maintained by the workbench window. These services
* are initialized during workbench window during the
* {@link #configureShell(Shell)}.
*/
ServiceLocator::Pointer serviceLocator;
QScopedPointer workbenchLocationService;
bool emptyWindowContentsCreated;
QWidget* emptyWindowContents;
QRect normalBounds;
bool asMaximizedState;
IPerspectiveListener::Events perspectiveEvents;
WWinPartService partService;
QStringList perspectiveExcludeList;
QStringList viewExcludeList;
struct ServiceLocatorOwner: public IDisposable
{
ServiceLocatorOwner(WorkbenchWindow* wnd);
WorkbenchWindow* window;
void Dispose();
};
IDisposable::Pointer serviceLocatorOwner;
class PageList
{
private:
// List of pages in the order they were created;
QList > pagesInCreationOrder;
// List of pages where the top is the last activated.
QList > pagesInActivationOrder;
// The page explicitly activated
SmartPointer active;
public:
typedef QList >::iterator iterator;
bool Add(SmartPointer object);
iterator Begin();
iterator End();
void Clear();
bool Contains(SmartPointer object);
bool Remove(SmartPointer object);
bool IsEmpty();
QList > GetPages() const;
void SetActive(SmartPointer page);
SmartPointer GetActive() const;
SmartPointer GetNextActive();
};
PageList pageList;
/**
* Notifies interested parties (namely the advisor) that the window is about
* to be opened.
*
* @since 3.1
*/
void FireWindowOpening();
/**
* Notifies interested parties (namely the advisor) that the window has been
* restored from a previously saved state.
*
* @throws WorkbenchException
* passed through from the advisor
* @since 3.1
*/
void FireWindowRestored();
/**
* Notifies interested parties (namely the advisor) that the window has been
* created.
*
* @since 3.1
*/
void FireWindowCreated();
/**
* Notifies interested parties (namely the advisor and the window listeners)
* that the window has been opened.
*
* @since 3.1
*/
void FireWindowOpened();
/**
* Notifies interested parties (namely the advisor) that the window's shell
* is closing. Allows the close to be vetoed.
*
* @return true
if the close should proceed,
* false
if it should be canceled
* @since 3.1
*/
bool FireWindowShellClosing();
/**
* Notifies interested parties (namely the advisor and the window listeners)
* that the window has been closed.
*
* @since 3.1
*/
void FireWindowClosed();
// /**
// * Fires page activated
// */
// void FirePageActivated(IWorkbenchPage::Pointer page);
//
// /**
// * Fires page closed
// */
// void FirePageClosed(IWorkbenchPage::Pointer page);
//
// /**
// * Fires page opened
// */
// void FirePageOpened(IWorkbenchPage::Pointer page);
/**
* Fires perspective activated
*/
void FirePerspectiveActivated(SmartPointer page,
IPerspectiveDescriptor::Pointer perspective);
/**
* Fires perspective deactivated.
*
* @since 3.2
*/
void FirePerspectivePreDeactivate(SmartPointer page,
IPerspectiveDescriptor::Pointer perspective);
/**
* Fires perspective deactivated.
*
* @since 3.1
*/
void FirePerspectiveDeactivated(SmartPointer page,
IPerspectiveDescriptor::Pointer perspective);
/**
* Fires perspective changed
*/
void FirePerspectiveChanged(SmartPointer ,
IPerspectiveDescriptor::Pointer perspective, const QString& changeId);
/**
* Fires perspective changed for an affected part
*/
void FirePerspectiveChanged(SmartPointer ,
IPerspectiveDescriptor::Pointer perspective,
IWorkbenchPartReference::Pointer partRef, const QString& changeId);
/**
* Fires perspective closed
*/
void FirePerspectiveClosed(SmartPointer ,
IPerspectiveDescriptor::Pointer perspective);
/**
* Fires perspective opened
*/
void FirePerspectiveOpened(SmartPointer ,
IPerspectiveDescriptor::Pointer perspective);
/**
* Fires perspective saved as.
*
* @since 3.1
*/
void FirePerspectiveSavedAs(SmartPointer ,
IPerspectiveDescriptor::Pointer oldPerspective,
IPerspectiveDescriptor::Pointer newPerspective);
/**
* Returns the workbench advisor. Assumes the workbench has been created
* already.
*
* IMPORTANT This method is declared private to prevent regular plug-ins
* from downcasting IWorkbenchWindow to WorkbenchWindow and getting hold of
* the workbench advisor that would allow them to tamper with the workbench.
* The workbench advisor is internal to the application.
*
*/
/* private - DO NOT CHANGE */
WorkbenchAdvisor* GetAdvisor();
/**
* Returns the window advisor, creating a new one for this window if needed.
*
* IMPORTANT This method is declared private to prevent regular plug-ins
* from downcasting IWorkbenchWindow to WorkbenchWindow and getting hold of
* the window advisor that would allow them to tamper with the window. The
* window advisor is internal to the application.
*
*/
/* private - DO NOT CHANGE */
WorkbenchWindowAdvisor* GetWindowAdvisor();
/**
* Returns the action bar advisor, creating a new one for this window if
* needed.
*
* IMPORTANT This method is declared private to prevent regular plug-ins
* from downcasting IWorkbenchWindow to WorkbenchWindow and getting hold of
* the action bar advisor that would allow them to tamper with the window's
* action bars. The action bar advisor is internal to the application.
*
*/
/* private - DO NOT CHANGE */
ActionBarAdvisor::Pointer GetActionBarAdvisor();
/*
* Returns the IWorkbench implementation.
*/
Workbench* GetWorkbenchImpl();
bool UnableToRestorePage(IMemento::Pointer pageMem);
/**
* Close the window.
*
* Assumes that busy cursor is active.
*/
bool BusyClose();
/**
* Unconditionally close this window. Assumes the proper flags have been set
* correctly (e.i. closing and updateDisabled)
*/
bool HardClose();
/**
* Close all of the pages.
*/
void CloseAllPages();
/**
* Save all of the pages. Returns true if the operation succeeded.
*/
bool SaveAllPages(bool bConfirm);
void ShowEmptyWindowContents();
void HideEmptyWindowContents();
- struct ShellActivationListener: public IShellListener
+ struct ShellEventFilter : public QObject
{
- ShellActivationListener(WorkbenchWindow::Pointer window);
-
- void ShellActivated(const ShellEvent::Pointer& event);
-
- void ShellDeactivated(const ShellEvent::Pointer& event);
-
- private:
-
- WorkbenchWindow::WeakPtr window;
- };
-
- QScopedPointer shellActivationListener;
-
- /**
- * Hooks a listener to track the activation and deactivation of the window's
- * shell. Notifies the active part and editor of the change
- */
- void TrackShellActivation(Shell::Pointer shell);
-
- struct ControlResizeListener: public GuiTk::IControlListener
- {
- ControlResizeListener(WorkbenchWindow* window);
-
- GuiTk::IControlListener::Events::Types GetEventTypes() const;
-
- void ControlMoved(GuiTk::ControlEvent::Pointer e);
-
- void ControlResized(GuiTk::ControlEvent::Pointer e);
+ ShellEventFilter(WorkbenchWindow* window);
+ bool eventFilter(QObject* watched, QEvent* event);
private:
-
- void SaveBounds();
+ void SaveBounds(const QRect& newBounds);
+ void ShellActivated();
+ void ShellDeactivated();
WorkbenchWindow* window;
};
- GuiTk::IControlListener::Pointer controlResizeListener;
+ ShellEventFilter resizeEventFilter;
/**
* Hooks a listener to track the resize of the window's shell. Stores the
* new bounds if in normal state - that is, not in minimized or maximized
* state)
*/
void TrackShellResize(Shell::Pointer newShell);
/**
* Returns true iff we are currently deferring UI processing due to a large
* update
*
* @return true iff we are deferring UI updates.
*/
bool UpdatesDeferred() const;
/**
* Initializes all of the default command-based services for the workbench
* window.
*/
void InitializeDefaultServices();
void FirePropertyChanged(const QString& property, const Object::Pointer& oldValue,
const Object::Pointer& newValue);
};
}
#endif /*BERRYWORKBENCHWINDOW_H_*/
diff --git a/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/util/berryPresentablePartFolder.cpp b/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/util/berryPresentablePartFolder.cpp
index 866b606fa2..3ddf95a22a 100755
--- a/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/util/berryPresentablePartFolder.cpp
+++ b/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/util/berryPresentablePartFolder.cpp
@@ -1,436 +1,400 @@
/*===================================================================
BlueBerry Platform
Copyright (c) German Cancer Research Center,
Division of Medical and Biological Informatics.
All rights reserved.
This software is distributed WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.
See LICENSE.txt or http://www.mitk.org for details.
===================================================================*/
#include "internal/berryQtWidgetsTweaklet.h"
#include "berryPresentablePartFolder.h"
#include "berryAbstractTabItem.h"
#include
#include
#include
namespace berry
{
-PresentablePartFolder::ContentProxyListener::ContentProxyListener(
- PresentablePartFolder* folder) :
- folder(folder)
-{
-}
-
-GuiTk::IControlListener::Events::Types PresentablePartFolder::ContentProxyListener::GetEventTypes() const
-{
- return static_cast(Events::MOVED & Events::RESIZED);
-}
-
-void PresentablePartFolder::ContentProxyListener::ControlMoved(
- GuiTk::ControlEvent::Pointer /*e*/)
-{
- folder->LayoutContent();
-}
-
-void PresentablePartFolder::ContentProxyListener::ControlResized(
- GuiTk::ControlEvent::Pointer /*e*/)
-{
-}
-
PresentablePartFolder::ShellListener::ShellListener(AbstractTabFolder* _folder) :
folder(_folder)
{
}
void PresentablePartFolder::ShellListener::ShellActivated(const ShellEvent::Pointer& /*e*/)
{
folder->ShellActive(true);
}
void PresentablePartFolder::ShellListener::ShellDeactivated(
const ShellEvent::Pointer& /*e*/)
{
folder->ShellActive(false);
}
PresentablePartFolder::ChildPropertyChangeListener::ChildPropertyChangeListener(
PresentablePartFolder* folder) :
presentablePartFolder(folder)
{
}
void PresentablePartFolder::ChildPropertyChangeListener::PropertyChange(
const Object::Pointer& source, int property)
{
if (source.Cast () != 0)
{
IPresentablePart::Pointer part = source.Cast ();
presentablePartFolder->ChildPropertyChanged(part, property);
}
}
PartInfo PresentablePartFolder::tempPartInfo = PartInfo();
void PresentablePartFolder::LayoutContent()
{
if (current != 0)
{
QRect clientArea = DragUtil::GetDisplayBounds(contentProxy);
QRect bounds = Tweaklets::Get(GuiWidgetsTweaklet::KEY)->ToControl(
folder->GetControl()->parentWidget(), clientArea);
current->SetBounds(bounds);
}
}
void PresentablePartFolder::InternalRemove(IPresentablePart::Pointer toRemove)
{
AbstractTabItem* item = this->GetTab(toRemove);
if (item != 0) {
item->Dispose();
}
// do not use item anymore!
if (std::find(partList.begin(), partList.end(), toRemove) != partList.end())
{
toRemove->RemovePropertyListener(childPropertyChangeListener.data());
partList.removeAll(toRemove);
}
}
void PresentablePartFolder::ChildPropertyChanged(
IPresentablePart::Pointer part, int property)
{
AbstractTabItem* tab = this->GetTab(part);
if (property == IPresentablePart::PROP_HIGHLIGHT_IF_BACK)
{
if (tab != 0 && this->GetCurrent() != part)
{//Set bold if it doesn't currently have focus
tab->SetBold(true);
this->InitTab(tab, part);
}
}
// else if (property == IPresentablePart::PROP_TOOLBAR)
// {
// if (tab != 0 && this->GetCurrent() == part)
// {
// folder->FlushToolbarSize();
// }
// if (tab != 0)
// {
// this->InitTab(tab, part);
// if (this->GetCurrent() == part)
// {
// this->Layout(true);
// }
// }
else if (property == IPresentablePart::PROP_CONTENT_DESCRIPTION || property
== IPresentablePart::PROP_PANE_MENU || property
== IPresentablePart::PROP_TITLE)
{
if (tab != 0)
{
this->InitTab(tab, part);
if (this->GetCurrent() == part)
{
this->Layout(true);
}
}
}
else if (property == IPresentablePart::PROP_PREFERRED_SIZE)
{
TabFolderEvent::Pointer event(
new TabFolderEvent(TabFolderEvent::EVENT_PREFERRED_SIZE, tab, 0, 0));
folder->FireEvent(event);
}
else
{
if (tab != 0)
this->InitTab(tab, part);
}
}
PresentablePartFolder::~PresentablePartFolder()
{
Tweaklets::Get(QtWidgetsTweaklet::KEY)->GetShell(folder->GetControl())->RemoveShellListener(
shellListener.data());
for (QList::iterator iter = partList.begin(); iter
!= partList.end(); ++iter)
{
(*iter)->RemovePropertyListener(childPropertyChangeListener.data());
}
- for (QWidget* currentWidget = contentProxy; currentWidget != 0 && currentWidget
- != folder->GetControl()->parentWidget(); currentWidget = currentWidget->parentWidget())
- {
- Tweaklets::Get(GuiWidgetsTweaklet::KEY)->RemoveControlListener(currentWidget, contentListener);
- }
-
BERRY_DEBUG << "DELETING PresentablePartFolder and contentProxy\n";
delete folder;
}
void PresentablePartFolder::InitTab(AbstractTabItem* item,
IPresentablePart::Pointer part)
{
tempPartInfo.Set(part);
item->SetInfo(tempPartInfo);
item->SetBusy(part->IsBusy());
if (part == this->GetCurrent())
{
folder->SetSelectedInfo(tempPartInfo);
//TODO Pane menu
//folder->EnablePaneMenu(part->GetMenu() != 0);
//setToolbar(part.getToolBar());
}
}
PresentablePartFolder::PresentablePartFolder(AbstractTabFolder* _folder) :
folder(_folder), isVisible(true), shellListener(new ShellListener(folder)),
childPropertyChangeListener(new ChildPropertyChangeListener(this))
{
Shell::Pointer controlShell =
Tweaklets::Get(QtWidgetsTweaklet::KEY)->GetShell(folder->GetControl());
controlShell->AddShellListener(shellListener.data());
folder->ShellActive(Tweaklets::Get(QtWidgetsTweaklet::KEY)->GetActiveShell()
== controlShell);
//folder.getControl().addDisposeListener(tabDisposeListener);
//toolbarProxy = new ProxyControl(folder.getToolbarParent());
- // NOTE: if the shape of contentProxy changes, the fix for bug 85899 in EmptyTabFolder.computeSize may need adjustment.
- contentListener = new ContentProxyListener(this);
- contentProxy = new QtControlWidget(folder->GetContentParent(), 0);
+ contentProxy = new QWidget(folder->GetContentParent());
contentProxy->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- //contentProxy->setVisible(false);
- for (QWidget* currentWidget = contentProxy; currentWidget != 0 && currentWidget
- != folder->GetControl()->parentWidget(); currentWidget = currentWidget->parentWidget())
- {
- Tweaklets::Get(GuiWidgetsTweaklet::KEY)->AddControlListener(currentWidget, contentListener);
- }
folder->SetContent(contentProxy);
}
QList PresentablePartFolder::GetPartList()
{
QList items = folder->GetItems();
QList result;
for (int i = 0; i < items.size(); i++)
{
result.push_back(this->GetPartForTab(items[i]));
}
return result;
}
void PresentablePartFolder::Insert(IPresentablePart::Pointer part, int idx)
{
poco_assert(folder->GetControl() != 0);
if (this->GetTab(part) != 0)
{
if (this->IndexOf(part) != idx)
this->Move(part, idx);
return;
}
idx = std::min(idx, static_cast(folder->GetItemCount()));
AbstractTabItem* item = 0;
int style = 0;
if (part->IsCloseable())
{
style |= Constants::CLOSE;
}
item = folder->Add(idx, style);
item->SetData(part);
this->InitTab(item, part);
part->AddPropertyListener(childPropertyChangeListener.data());
partList.push_back(part);
}
void PresentablePartFolder::Remove(IPresentablePart::Pointer toRemove)
{
if (toRemove == current)
{
this->Select(IPresentablePart::Pointer(0));
}
this->InternalRemove(toRemove);
}
void PresentablePartFolder::Move(IPresentablePart::Pointer part, int newIndex)
{
int currentIndex = this->IndexOf(part);
if (currentIndex == newIndex)
{
return;
}
folder->Move(currentIndex, newIndex);
//this->InternalRemove(part);
//this->Insert(part, newIndex);
//if (current == part)
//{
// folder->SetSelection(this->GetTab(part));
//}
}
int PresentablePartFolder::Size()
{
return folder->GetItemCount();
}
void PresentablePartFolder::SetBounds(const QRect& bounds)
{
QSize minSize = folder->ComputeSize(bounds.width(), Constants::DEFAULT);
QRect newBounds(bounds);
if (folder->GetState() == IStackPresentationSite::STATE_MINIMIZED
&& minSize.height() < bounds.height())
{
newBounds.setHeight(minSize.height());
}
// Set the tab folder's bounds
folder->GetControl()->setGeometry(newBounds);
this->Layout(false);
}
void PresentablePartFolder::Select(IPresentablePart::Pointer toSelect)
{
if (toSelect == current)
{
return;
}
if (toSelect != 0)
{
toSelect->SetVisible(true);
}
if (current != 0)
{
current->SetVisible(false);
//setToolbar(null);
}
current = toSelect;
AbstractTabItem* selectedItem = this->GetTab(toSelect);
folder->SetSelection(selectedItem);
if (selectedItem != 0)
{
// Determine if we need to un-bold this tab
selectedItem->SetBold(false);
this->InitTab(selectedItem, toSelect);
}
// else
// {
// setToolbar(null);
// }
this->Layout(true);
}
IPresentablePart::Pointer PresentablePartFolder::GetPartForTab(
AbstractTabItem* tab)
{
if (tab == 0)
{
return IPresentablePart::Pointer(0);
}
IPresentablePart::Pointer part = tab->GetData().Cast ();
return part;
}
AbstractTabItem* PresentablePartFolder::GetTab(IPresentablePart::Pointer part)
{
return folder->FindItem(part);
}
int PresentablePartFolder::IndexOf(IPresentablePart::Pointer part)
{
AbstractTabItem* item = this->GetTab(part);
if (item == 0)
{
return -1;
}
return folder->IndexOf(item);
}
AbstractTabFolder* PresentablePartFolder::GetTabFolder()
{
return folder;
}
void PresentablePartFolder::SetVisible(bool isVisible)
{
this->isVisible = isVisible;
this->GetTabFolder()->SetVisible(isVisible);
if (isVisible)
{
this->Layout(true);
}
}
void PresentablePartFolder::Layout(bool changed)
{
if (!isVisible)
{
// Don't bother with layout if we're not visible
return;
}
// Lay out the tab folder and compute the client area
folder->Layout(changed);
//toolbarProxy.layout();
this->LayoutContent();
}
IPresentablePart::Pointer PresentablePartFolder::GetCurrent()
{
return current;
}
}
diff --git a/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/util/berryPresentablePartFolder.h b/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/util/berryPresentablePartFolder.h
index 814174fcc2..0e21d47466 100755
--- a/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/util/berryPresentablePartFolder.h
+++ b/BlueBerry/Bundles/org.blueberry.ui.qt/src/internal/util/berryPresentablePartFolder.h
@@ -1,197 +1,175 @@
/*===================================================================
BlueBerry Platform
Copyright (c) German Cancer Research Center,
Division of Medical and Biological Informatics.
All rights reserved.
This software is distributed WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.
See LICENSE.txt or http://www.mitk.org for details.
===================================================================*/
#ifndef BERRYPRESENTABLEPARTFOLDER_H_
#define BERRYPRESENTABLEPARTFOLDER_H_
#include "berryIPresentablePartList.h"
#include "berryAbstractTabFolder.h"
#include "berryPartInfo.h"
#include
#include
#include
#include
namespace berry
{
class PresentablePartFolder: public IPresentablePartList
{
private:
AbstractTabFolder* folder;
IPresentablePart::Pointer current;
//private ProxyControl toolbarProxy;
QWidget* contentProxy;
static PartInfo tempPartInfo;
QList partList;
bool isVisible;
- /**
- * Movement listener. Updates the bounds of the target to match the
- * bounds of the dummy control.
- */
- struct ContentProxyListener : public GuiTk::IControlListener
- {
- ContentProxyListener(PresentablePartFolder*);
-
- Events::Types GetEventTypes() const;
-
- void ControlMoved(GuiTk::ControlEvent::Pointer e);
-
- void ControlResized(GuiTk::ControlEvent::Pointer e);
-
- private:
-
- PresentablePartFolder* folder;
-
- };
-
- GuiTk::IControlListener::Pointer contentListener;
-
struct ShellListener: public IShellListener
{
ShellListener(AbstractTabFolder* folder);
void ShellActivated(const ShellEvent::Pointer& e);
void ShellDeactivated(const ShellEvent::Pointer& e);
private:
AbstractTabFolder* folder;
};
QScopedPointer shellListener;
/**
* Listener attached to all child parts. It responds to changes in part properties
*/
struct ChildPropertyChangeListener: public IPropertyChangeListener
{
ChildPropertyChangeListener(PresentablePartFolder* folder);
using IPropertyChangeListener::PropertyChange;
void PropertyChange(const Object::Pointer& source, int property);
private:
PresentablePartFolder* presentablePartFolder;
};
QScopedPointer childPropertyChangeListener;
// /**
// * Dispose listener that is attached to the main control. It triggers cleanup of
// * any listeners. This is required to prevent memory leaks.
// */
// private DisposeListener tabDisposeListener = new DisposeListener() {
// public void widgetDisposed(DisposeEvent e) {
// if (e.widget == folder.getControl()) {
// // If we're disposing the main control...
// disposed();
// }
// }
// };
void LayoutContent();
void InternalRemove(IPresentablePart::Pointer toRemove);
// void SetToolbar(Control newToolbar) {
// if (folder.getToolbar() != newToolbar) {
// folder.setToolbar(newToolbar);
// }
// }
void ChildPropertyChanged(IPresentablePart::Pointer part, int property);
protected:
void InitTab(AbstractTabItem* item, IPresentablePart::Pointer part);
public:
/**
* The PresentablePartFolder takes ownership of the AbstractTabFolder pointer.
*/
PresentablePartFolder(AbstractTabFolder* folder);
~PresentablePartFolder();
/* (non-Javadoc)
* @see org.blueberry.ui.internal.presentations.util.IPresentablePartList#getPartList()
*/
QList GetPartList();
/**
* Adds the given presentable part directly into this presentation at the
* given index. Does nothing if a tab already exists for the given part.
* This is intended to be called by TabOrder and its subclasses.
*
* @param part part to add
* @param idx index to insert at
*/
void Insert(IPresentablePart::Pointer part, int idx);
void Remove(IPresentablePart::Pointer toRemove);
/**
* Moves the given part to the given index. When this method returns,
* indexOf(part) will return newIndex.
*
* @param part
* @param newIndex
*/
void Move(IPresentablePart::Pointer part, int newIndex);
/**
* Returns the number of parts in this folder
*/
int Size();
void SetBounds(const QRect& bounds);
void Select(IPresentablePart::Pointer toSelect);
IPresentablePart::Pointer GetPartForTab(AbstractTabItem* tab);
/**
* Returns the tab for the given part, or null if there is no such tab
*
* @param part the part being searched for
* @return the tab for the given part, or null if there is no such tab
*/
AbstractTabItem* GetTab(IPresentablePart::Pointer part);
int IndexOf(IPresentablePart::Pointer part);
AbstractTabFolder* GetTabFolder();
void SetVisible(bool isVisible);
void Layout(bool changed);
IPresentablePart::Pointer GetCurrent();
};
}
#endif /* BERRYPRESENTABLEPARTFOLDER_H_ */