⛏️ index : haiku.git

/*
 * Copyright 2002-2009 Haiku, Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *		Jerome Duval, jerome.duval@free.fr
 */
#ifndef BACKGROUNDS_VIEW_H
#define BACKGROUNDS_VIEW_H


#include <Box.h>
#include <Button.h>
#include <CheckBox.h>
#include <ColorControl.h>
#include <Control.h>
#include <Cursor.h>
#include <Entry.h>
#include <FilePanel.h>
#include <Menu.h>
#include <MenuItem.h>
#include <Message.h>
#include <Picture.h>
#include <Screen.h>
#include <ScrollView.h>
#include <ScrollBar.h>
#include <String.h>
#include <StringView.h>
#include <TextControl.h>
#include <View.h>

#include "BackgroundImage.h"


#define SETTINGS_FILE		"Backgrounds_settings"


class ImageFilePanel;


class BGImageMenuItem : public BMenuItem {
public:
							BGImageMenuItem(const char* label, int32 imageIndex,
								BMessage* message, char shortcut = 0,
								uint32 modifiers = 0);

			int32			ImageIndex() { return fImageIndex; }

private:
			int32			fImageIndex;
};


enum frame_parts {
	FRAME_TOP_LEFT = 0,
	FRAME_TOP,
	FRAME_TOP_RIGHT,
	FRAME_LEFT_SIDE,
	FRAME_RIGHT_SIDE,
	FRAME_BOTTOM_LEFT,
	FRAME_BOTTOM,
	FRAME_BOTTOM_RIGHT,
};


class FramePart : public BView {
public:
								FramePart(int32 part);

	virtual	void				Draw(BRect rect);
			void				SetDesktop(bool isDesktop);

private:
			void				_SetSizeAndAlignment();

			int32				fFramePart;
			bool				fIsDesktop;
};


class Preview : public BControl {
public:
								Preview();

			BPoint				fPoint;
			BRect				fImageBounds;

protected:
	virtual	void				MouseDown(BPoint point);
	virtual	void				MouseUp(BPoint point);
	virtual	void				MouseMoved(BPoint point, uint32 transit,
									const BMessage* message);
	virtual	void				AttachedToWindow();

			BPoint				fOldPoint;
			float				fXRatio;
			float				fYRatio;
			display_mode		fMode;
};


class BackgroundsView : public BBox {
public:
								BackgroundsView();
								~BackgroundsView();

			void				AllAttached();
			void				MessageReceived(BMessage* message);

			void				RefsReceived(BMessage* message);

			void				SaveSettings();
			void				WorkspaceActivated(uint32 oldWorkspaces,
									bool active);
			int32				AddImage(BPath path);
			Image*				GetImage(int32 imageIndex);

			bool				FoundPositionSetting();

protected:
			void				_Save();
			void				_NotifyServer();
			void				_NotifyScreenPreflet();
			void				_LoadSettings();
			void				_LoadDesktopFolder();
			void				_LoadDefaultFolder();
			void				_LoadFolder(bool isDesktop);
			void				_LoadRecentFolder(BPath path);
			void				_UpdateWithCurrent();
			void				_UpdatePreview();
			void				_UpdateButtons();
			void				_SetDesktop(bool isDesktop);
			void				_AddRecentFolder(BPath path,
									bool notifyApp = false);

	static	int32				_NotifyThread(void* data);

			BGImageMenuItem*	_FindImageItem(const int32 imageIndex);

			bool				_AddItem(BGImageMenuItem* item);

			BackgroundImage::Mode	_FindPlacementMode();

			BColorControl*		fPicker;
			BButton*			fApply;
			BButton*			fRevert;
			BCheckBox*			fIconLabelOutline;
			BMenu*				fPlacementMenu;
			BMenu*				fImageMenu;
			BMenu*				fWorkspaceMenu;
			BTextControl*		fXPlacementText;
			BTextControl*		fYPlacementText;
			Preview*			fPreview;
			BFilePanel*			fFolderPanel;
			ImageFilePanel*		fPanel;

			BackgroundImage*	fCurrent;

			BackgroundImage::BackgroundImageInfo*	fCurrentInfo;

			entry_ref			fCurrentRef;
			int32				fLastImageIndex;
			int32				fRecentFoldersLimit;
			BMessage			fSettings;

			BObjectList<BPath, true> fPathList;
			BObjectList<Image, true> fImageList;

			FramePart*			fTopLeft;
			FramePart*			fTop;
			FramePart*			fTopRight;
			FramePart*			fLeft;
			FramePart*			fRight;
			FramePart*			fBottomLeft;
			FramePart*			fBottom;
			FramePart*			fBottomRight;

			bool				fFoundPositionSetting;
};

#endif	// BACKGROUNDS_VIEW_H